Chaque objet a un nombre de références. Quand il passe à 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 compte de référence 1.
- L'objet est remis à
self
méthode setAController:
, qui lui envoie un message retain
(parce que la méthode ne sait pas d'où l'objet vient), incrémentant son nombre de référence à 2.
- Le code d'appel n'a plus besoin de l'objet lui-même, il appelle
release
, décrémenter le nombre de références à 1.
Votre deuxième exemple fait essentiellement les étapes 1 et 2, mais pas 3, donc à la fin de la référence de l'objet count est 2.
La règle est que si vous créez un objet, vous êtes responsable de le libérer lorsque vous avez terminé. Dans votre exemple, le code est fait avec tempAController après avoir défini la propriété. Il est de la responsabilité de la méthode Setter d'appeler le retain
si elle a besoin de cet objet.
Il est important de se rappeler que self.property = foo;
en Objective-C est vraiment juste un raccourci pour [self setProperty:foo];
et que la méthode setProperty:
va être conserver ou copier des objets au besoin.
Si la propriété a été déclarée @property (copy)
, l'objet aurait été copié au lieu de conservé. Dans le premier exemple, l'objet original serait libéré immédiatement; dans le deuxième exemple, le nombre de références de l'objet original serait 1 même s'il devrait être 0. Donc vous voudriez toujours écrire votre code de la même manière.
Si la propriété a été déclarée @property (assign)
, alors 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és uniquement pour les délégués d'objet.
C'est le cas que si 'aController' est déclarée avec le @property (conserver), non? –
C'est exact. –
C'est également le modèle correct si la propriété est déclarée (copie). Le deuxième modèle est correct pour une propriété déclarée (assigner) (ou avec la récupération de place activée). –