Je regarde un code open source et essaye de comprendre pourquoi l'auteur a fait quelque chose d'une manière particulière.Quel est le point dans une retenue immédiatement suivie d'une autorelease?
La classe est un wrapper autour NSArray
pour créer une structure de données de la pile avec push, pop, etc.
Une méthode est topObject
qui retourne l'objet de premier plan sur la pile et sa mise en œuvre est la suivante:
- (id)top {
return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray
}
Qu'est-ce qui est retenu, suivi d'une autorelease immédiate?
Ma réaction initiale était que cela empêcherait un analyseur d'avertir d'une fuite de mémoire, mais j'ai analysé sans retenir/autorelease et il n'y avait toujours pas d'avertissement.
En regardant le cycle de vie, un objet serait créé, poussé vers la pile et libéré, de sorte que la pile possède l'objet (le tableau sous-jacent le conservera lors de l'ajout).
Je ne comprends pas l'utilisation de la retenir/autorelease ici ...
C'est logique, merci. – Jasarien
Ce n'est toujours pas correct de le faire. Le Guide de programmation de la gestion de la mémoire indique que «De même que vous ne devriez pas vous préoccuper du nombre réel de retenues d'un objet, vous ne devriez pas vous préoccuper de savoir si un objet retourné est auto-libéré ou non. ne pas." - donc la rétention + autorelease devrait se produire dans le foo = [bar top]; line, pas dans la méthode - (id) top {}. –
Réponse bien expliquée. –