Chaque objet a un compte de référence. Lorsqu'il atteint 0, l'objet est désalloué.
En supposant que la propriété a été déclarée comme @property (retain)
:
Votre premier exemple, ligne par ligne :
- L'objet est créé par
alloc
il a un nombre de référence de 1.
- L'objet est remis à
self
's setAController:
qui lui envoie un retain
(parce que la méthode ne sait pas d'où vient l'objet), incrémentant son compte de référence à 2.
- Le code appelant n'a plus besoin de l'objet lui-même, il appelle donc
release
en décrémentant le nombre de références à 1.
Votre deuxième exemple fait essentiellement les étapes 1 et 2 mais pas la 3, donc à la fin le nombre de références de l'objet est de 2.
La règle est que si vous créez un objet, vous êtes responsable de le libérer lorsque vous en avez fini avec lui. Dans votre exemple, le code a terminé avec tempAController après avoir défini la propriété. C'est la responsabilité de la méthode setter d'appeler retain
s'il a besoin que cet objet reste dans le coin.
Il est important de se rappeler que self.property = foo;
en Objective-C est en fait un raccourci pour [self setProperty:foo];
et que le setProperty:
va conserver ou copier des objets selon les besoins.
Si la propriété a été déclarée @property (copy)
Dans ce cas, l'objet aurait été copié au lieu d'être conservé. Dans le premier exemple, l'objet d'origine serait libéré immédiatement ; dans le deuxième exemple, le nombre de références de l'objet d'origine serait de 1 alors qu'il devrait être de 0. Vous devriez donc continuer à écrire votre code de la même manière.
Si la propriété a été déclarée @property (assign)
entonces self
ne revendique pas la propriété de l'objet, et quelqu'un d'autre doit le conserver. Dans ce cas, le premier exemple serait incorrect. Ces types de propriétés sont rares, généralement utilisées uniquement pour les délégués d'objets.