Domanda

Ho imparato che in dealloc fai [rilascio oggetto]; ma in viewDidUnload (in una sottoclasse UIViewController) fai < codice> self.object = nil . Qual è davvero la differenza perché self.object = nil (supponiamo che l'oggetto sia una proprietà (nonatomic, keep) ) conserva nil ( che non fa nulla) e quindi rilascia il vecchio valore e quindi il conteggio dei riferimenti è 0 giusto?

È stato utile?

Soluzione

self.object = nil chiama il tuo setter, che rilascerà il vecchio valore, imposterà il membro su nil e probabilmente farà altre cose (è un metodo, quindi potrebbe fare qualsiasi cosa). Il "tutto" parte di ciò è potenzialmente pericoloso; vedi questa domanda , per esempio.

[rilascio oggetto] rilascia il vecchio valore, ma lascia il membro come un puntatore ora penzolante, che è una buona ricetta per i bug. In dealloc non ha molta importanza, poiché anche il puntatore stesso sta per sparire, ma in ogni caso è una pessima idea rilasciare un membro senza impostarlo su nil .

(Come sidenote, non dovresti mai presumere che il rilascio di un oggetto gli dia un conteggio di riferimento di 0. Rilascia il tuo riferimento, ma altri oggetti potrebbero ancora avere riferimenti ad esso.)

Altri suggerimenti

Se si esegue object = nil senza [rilascio oggetto] , ciò potrebbe causare perdite di memoria. Se successivamente fai [rilascio oggetto] senza oggetto = zero , l'oggetto diventa puntatore penzolante come suggerito da @Jim. self.object = nil è uno zucchero per la chiamata della funzione setter.

Se si esegue [rilascio oggetto] e si desidera accedere all'oggetto, l'app si blocca semplicemente. Se fai object = nil e vuoi accedere all'oggetto non funzionerà nulla.

Il motivo è nella [versione oggetto], si tenta di liberare l'oggetto. quindi non ha alcun puntatore (nessun memoty). Nell'oggetto = nil, si tenta di assegnare l'oggetto con un puntatore null. quindi se provi ad accedere all'oggetto non accadrà nulla.

Generalmente abbiamo scritto il codice come [ release dell'oggetto]; object = nil; perché se accedi all'oggetto in modo imprevisto, l'app non si arresterà in modo anomalo.

Se rilasci un oggetto, diventerà un oggetto liberato.

E se provi a eseguire qualsiasi tipo di operazione sull'oggetto liberato, l'app si arresta in modo anomalo. Per evitare tali incidenti, è sempre preferibile "assegnare l'oggetto a zero dopo averlo rilasciato". Perché sappiamo tutti che qualsiasi operazione eseguita su zero non verrà eseguita :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top