Comment effacer un NSMutableArray d'objets personnalisés sans créer de fuites de mémoire?
Si j'ai un NSMutableArray d'objets personnalisés, comment puis-je doit facilement effacer le tableau sans causer des problèmes de mémoire? Supposons que l'objet personnalisé de classe a une méthode dealloc dans lequel correctement publié une instance de variables etc.
Par exemple, est-il possible d'utiliser le NSArray "removeAllObjects" méthode?
- Si oui, comment cela fonctionne - t "removeAllObjects" appel "dealloc" méthode sur chaque objet en tant qu'il supprime
- Si aucun - quelle serait l'approche la plus facile à utiliser?
EDIT (après 4 réponses) - Une dernière question de clarification après le grand les réponses - je ne suis pas encore tout à fait sûr sur les variables d'instance/propriétés dans mon objet personnalisé que j'ai mis à retenir? Ceux-ci semblent être libéré par le "dealloc" de la méthode dans mon objet personnalisé de classe, où nous le faire manuellement avec [super release].
Donc, si, ré compensation d'un tableau, si je fais un removeAllObjects, puis NSArray questions à "libérer" de mes objets personnalisés, mais ne l'appelez pas "dealloc", alors comment faire mon variables d'instance sortir?
source d'informationauteur Greg
Vous devez vous connecter pour publier un commentaire.
removeAllObjects
de supprimer l'objet de la matrice. Ce processus permettra d'envoyer un message de libération de l'objet et cela va faire diminuer son nombre de références. Lorsque le compteur de référence atteint zéro, l'objet sera libéré.ne pas faire comme cela, car il sera de fuite.
c'est la façon correcte:
Au lieu de l'appeler removeAllObjects vous pouviez juste de libérer le tableau. Si un tableau est libéré de tout ce qui est à l'intérieur de, il est libéré et si il n'y a pas d'autre référence à l'objet, il sera libéré.
Yep, il suffit d'appeler
removeAllObjects
. Juste pour être sûr, vous n'appelez pasretain
lorsque vous ajoutez un objet à un tableau ou lorsque vous créez un tableau avec les objets. C'est fait automatiquement pour vous.Concernant
dealloc
de nouveau qui sera fait automatiquement, et vous ne pouvez pas prédire quand.La seule chose que vous devez avoir dans le dealloc est la matrice de l'objet lui-même. C'est, en supposant que c'est une variable d'instance ou ivar?
Afin de vérifier que tout est bon, exécutez l'Analyseur à l'aide de Produit -> Analyser. Et puis donner de l'application d'un profil dans les Instruments à l'aide de la les Fuites instrument pour vérifier qu'aucune partie de votre code à l'origine de toutes les fuites de mémoire.
Fondamentalement
removeAllObjects
méthode envoierelease
message à tous les objets. Le libération méthode décrémente les objets de comptage de référence. Et si le compteur de référence d'un objet atteint0
puis ledealloc
message sera envoyé à l'objet.La réponse à votre question appelle
[array removeAllObjects]
est complètement sûr. Par ailleurs, si vous ne voulez pas le tableau plus que vous pouvez appeler directement[array release]
qui libère tous ses objets ainsi que dans le tableau.La
dealloc
méthode n'est jamais appelé directement. Tout est fait à travers leretain
/release
mécanisme (et le comptage de référence principe). C'est donc lerelease
méthode qui est appelée, pas ladealloc
directement. Ledealloc
méthode n'est appelée par le moteur d'exécution si le dernierrelease
appel provoque le comptage de référence (retainCount) de l'objet atteint zéro, ce qui signifie que l'objet est vraiment libéré de la mémoire que personne ne s'en sert plus.NSArray
et toutes les classes de conteneurs dans le Cacao (NSDictionary
NSSet
...) ne conservent leurs valeurs. Ainsi, lorsque vous ajoutez un objet, d'un conteneur commeNSArray
ilretain
cette valeur. Et lorsque vous supprimez cette valeur (y compris lorsque vous appelez removeAllObjects")release
.Mémoire Mgmt règles sont faciles à suivre: mais la seule règle qui compte, il vous suffit d'appeler
release
ouautorelease
si vous l'avez appeléalloc
retain
oucopy
méthodes. C'est toujours de la responsabilité de l'objet qui a lealloc
/retain
/copy
d'appeler lerelease
/autorelease
. Ne laissez jamais unalloc
/retain
/copy
sans attenterelease
/autorelease
appel à l'équilibre (ou vous avez des fuites), mais d'un autre côté il ne faut jamais appelerrelease
/autorelease
si vous n'avez pas lealloc
/retain
/copy
appeler vous-même.Bon exemple 1:
Bon exemple 2:
Bon exemple 3:
Mauvais exemple: