Poiché la variabile b
è completamente interna alla classe A
, e non è dichiarato come @public
(il valore predefinito è @protected
), il modo migliore per sapere se b
è stato deallocato è quello di rilasciarlo e impostare il puntatore nil
. In questo modo, puoi semplicemente controllare if (b == nil)
e creare una nuova istanza, se necessario.
La domanda più grande, tuttavia, è ciò che è la vera natura e il comportamento della memoria di b
. Tu affermi che "l'oggetto B può essere liberato in livelli di memoria bassi", ma non spiega perché. Se stai usando gli idiomi standard per retain-release in Objective-C, penserei che sarebbe A a determinare se B dovrebbe essere deallocato, dal momento che sta creando una nuova istanza. Se non si intende che A effettui tali decisioni, consentendogli di assegnare una nuova B, si verificheranno confusione nella proprietà e errori di memoria lungo la strada.
Se A non è responsabile di B, e se siete su Leopard (o oltre) e hanno attivato la raccolta dei rifiuti, ciò che si può desiderare è un azzeramento riferimento debole. Viene dichiarato utilizzando __weak
prima di una dichiarazione di variabile di istanza e non impedisce al garbage collector di raccogliere l'oggetto a cui punta. (Un riferimento "forte" è l'impostazione predefinita e il garbage collector non rilascia deallocolo che può tracciare da una radice attraverso solo riferimenti forti.) Inoltre, il GC imposterà automaticamente i riferimenti deboli a 0 se/quando l'oggetto è deallocato.
Tornando alla "domanda più grande", a meno che b
sia già un riferimento debole e GC sia attivo, (e alcune altre condizioni sono in attesa), il sistema non rilascia automaticamente B per te.Se il motivo della deallocazione di b
è che le istanze di B crescono nel tempo, (come una cache di articoli non disponibili), sarebbe molto meglio avere un modo per svuotare B. Ad esempio, le raccolte mutabili in Foundation hanno un metodo -removeAllObjects
. Un simile approccio eviterebbe la maggior parte della confusione sul fatto che esista ancora b
ed è molto più efficiente di (de) allocare più volte gli oggetti.
fonte
2009-06-11 22:07:37
Sembra che questo articolo possa mostrarvi come farlo: [Esegui codice nella deallocazione di qualsiasi oggetto] (http://blog.slaunchaman.com/2011/04/11/fun-with- the-objective-c-runtime-run-code-at-deallocation-of-any-object) – Oscar