2009-09-23 13 views
17

Mi viene un po 'fastidio il fatto che alcuni oggetti vengano rilasciati automaticamente senza che io lo sappia. Probabilmente è una buona cosa, ma se lo sono, lo voglio sapere. La documentazione non dice quali metodi autorelease obietta, quindi di solito metto alla prova la mia strada, che a mio parere è stupida. Ad esempio, [Data NSDate] autorizza automaticamente l'oggetto e anche [NSArray arrayWithObjects: ...]. Come fai a sapere senza la documentazione che ti dice?Come sapere se un oggetto è autoreleased o no?

Sto iniziando a vedere un modello anche se metodi come questi, quelli che creano oggetti con una funzione statica, restituisce sempre l'oggetto autoreleased. È sempre vero?

+0

Credo che intendiate "metodo di classe" (anziché "metodo di istanza") piuttosto che "funzione statica". Come indicato di seguito, il +/- non determina se un oggetto restituito è autoreleased, è una questione di convenzione e regole semplici. La maggior parte dei metodi restituisce oggetti che devono essere conservati - i metodi che restituiscono un oggetto con un conteggio dei ritardi +1 sono l'eccezione piuttosto che la regola. –

+0

Metodo di classe intendevo davvero. Ho usato "statico" dalla terminologia java e per qualche ragione "funzione", anche se avrebbe dovuto essere "metodo". Beh, sono tutti uguali nella memoria comunque. :) – quano

risposta

21

In sostanza, se si init, copy o retain un oggetto si è responsabile per il rilascio. Se non lo fai, non sei responsabile per il rilascio.

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

Molte classi forniscono metodi della forma + className ... che è possibile utilizzare per ottenere una nuova istanza della classe. Spesso definiti "convenienza costruttori", questi metodi creano una nuova istanza della classe , inizializzano lo e lo restituiscono per l'uso. Sebbene si possa pensare di essere il responsabile del rilascio di oggetti creato in questo modo, che non è il caso in base alla politica di proprietà impostata in precedenza. Poiché la classe crea il nuovo oggetto, è lo responsabile dello smaltimento del nuovo oggetto .

+0

Anche questa è una buona risposta. – bobobobo

4

La firma del metodo stessa indica. Il modello dei metodi con firme come "classNameWithData: data1: data2" è quello di restituire un'istanza alloc/init/autorelease di quella cosa. Loro sono convenienze là in modo da non doverlo fare.

Se non si desidera una versione autorelease di qualcosa, quindi non istanziarli in quel modo, e utilizzare l'alloc/init corretto e rilasciare quando si è fatto. Questo metodo è molto più esplicito e un po 'più incline agli errori, perché se viene lanciata un'eccezione il blocco di rilascio può essere perso, ma questo è il prezzo che si paga per averlo in quel modo.

+0

+1. Se non si utilizza alloc/init per ottenere un oggetto, si presuppone che sia autoreleased e gestirlo in modo appropriato. – Abizern

Problemi correlati