2010-08-04 7 views
7

Sono nuovo di Objective-C (e StackOverflow) e sono un po 'girati circa le migliori pratiche in materia di proprietà.Proprietà in dealloc: rilascio quindi impostato su zero? o semplicemente rilasciare

La mia comprensione è che quando si è completamente in possesso di una proprietà è possibile evitare i bug rilasciandoli e quindi impostando immediatamente su nil in modo che anche i messaggi successivi restituiscano nil anziché un'eccezione.

[myProperty release], myProperty = nil;

Tuttavia, quando si tratta di dealloc per le proprietà "copia" e "conserva", è necessario eseguire entrambe le operazioni? o un semplice

[myProperty release] tagliato? Inoltre, ho ragione sul fatto che non ho bisogno di rilasciare le proprietà 'assign' in dealloc?

Grazie!

risposta

17

Rilasciare, ma non preoccuparsi di impostare su zero. Impostazione a zero tramite il setter @synthesized:

self.myProperty = nil 

rilascerà il vecchio valore come parte della riassegnazione (anche se, come notato nei commenti, possono avere effetti collaterali indesiderati), ma semplicemente assegnando zero alla variabile membro:

myProperty = nil 

no.

[myProperty release] 

è tutto ciò che serve.

(e avete ragione di "assegnare" le proprietà.)

+3

+1 che la versione è tutto ciò che serve, ma mi piacerebbe evitare l'uso di 'self.myProperty = nil' in' dealloc '(potrebbe attivare metodi KVO e notificare agli osservatori di provare ad accedere a un oggetto parzialmente deallocato ...) –

+4

Come dice Dave, la pratica corrente consigliata (da Apple) non è quella di utilizzare gli accessor per assegnare nil (e quindi rilascio) in dealloc. Non solo ha potuto attivare i metodi KVO, ma l'accessor set potrebbe essere stato sovrascritto da una sottoclasse. – JeremyP

+1

Più vecchio e più saggio ora ... la migliore pratica sembra essere quella di utilizzare self.myProperty = nil per le proprietà di IB in viewDidUnload. Ciò consente a viewController di ristabilire la gerarchia della vista se è stata smantellata da una memoria insufficiente. – averydev

0

@ Dave DeLong e jeremyp: penso che potremmo dire “utilizzando i messaggi ereditati (dirette o indirette per uno, chiamando una parte da super) whil“ costruire "un oggetto (da init ..., new ... o copy ...) è come costruire una casa e posizionare il tetto su di esso mentre nessuno è sicuro, se il seminterrato è già lì. E farlo mentre dealloc potrebbe essere l'equivalente di abbattere quella casa, cominciando buttando giù i muri di fondazione, non essendo sicuro se essere dentro la sua cantina ".

Durante l'utilizzo di metodi senza ereditarietà potrebbe farlo anche questo, ma se sei il tuo, puoi (e avere) controllarlo.

saluti

0

@ Dave DeLong: Quando si esegue il metodo dealloc di un oggetto, l'oggetto non viene più utilizzato. Tutti gli osservatori kvo dovrebbero essere rimossi in quel momento, altrimenti calerà il tramonto. E comunque - anche se un osservatore vedesse il cambiamento l'oggetto esisterebbe ancora (almeno in parte).

L'accesso sovrascritto è l'argomento giusto, penso. Tuttavia, per le tue classi potrebbe essere ancora più semplice utilizzare l'accessor. Soprattutto quando si usano metodi sintetizzati, dove si conosce la semantica ma non ci sono dettagli sull'accessorio ...

Problemi correlati