2010-06-29 3 views
2

Si j'ai une fonction comme celui-ciautorelease objet précédent par cession

void setSomeObject(SomeObjectClass obj /*, and some other params*/) 
{ 
    [_previous autorelease]; 
    _previous = obj; 
} 

Pour autant que je l'ai compris le message autorelease est envoyé à l'objet lui-même (non _previous) donc à un moment donné, à un moment où setSomeObject sort de la portée de l'objet original est auto-libéré (le cas échéant). Est-ce correct? Je n'utilise pas les propriétés mais je suppose qu'en les utilisant la sortie de l'objet précédent serait automatique quand je le ferais self.previous = obj;?

Répondre

1

Lorsque vous envoyez un message -autorelease à un objet, il est ajouté au NSAutoreleasePool actif, qui est vidé lors de l'exécution de la boucle d'exécution. Si vous dites [_previous autorelease], seul cet objet sera auto-libéré, et si vous dites _previous = obj, cela ne change que la référence de la variable. L'ancien objet est toujours auto-libéré.

Si vous faites cela dans une méthode setter, c'est ce que le modèle est généralement:

- (void)setSomeObject:(MyObjClass *obj) { 
    if (obj != someObject) { 
     [someObject release]; 
     someObject = [obj retain]; // or copy, depending on what you want 
    } 
} 
+0

donc dans un sens, on pourrait aussi écrire [_previous autorelease] mais il n'est pas standard? (bien que vous devez vous assurer qu'il ne pointe pas déjà sur le même objet) – BuggerMe

+0

Oui. Si vous rappelez les règles fondamentales de gestion de la mémoire, tout objet dont vous avez la propriété (acquis par alloc/new/copy/retain) doit être abandonné plus tard (release ou autorelease), donc l'un ou l'autre fonctionnera. Mais dans ce cas, il n'y a pas besoin d'autorelease, puisque vous n'avez pas besoin de faire référence à l'objet dans le reste de la fonction. Une autre façon d'éviter tout cela est d'utiliser regular @property (copier) ou (retainer) avec @synthesize, qui crée des méthodes d'accesseur pour vous, et au lieu de faire tout ce que j'ai écrit dans ma réponse, vous pouvez simplement faire ' self.someObject = obj'. – jtbandes

0

Non, cela est incorrect.

[autorelease précédente] envoie le message autorelease à _previous. C'est la signification de cette syntaxe.

Questions connexes