Utilisez autorelease lors de la définition d'une propriété retain à l'aide de la syntaxe à points?

Je vois dans un exemple de code que autorelease est utilisé. Je ne suis pas familier avec les cas où cela est nécessaire. Par exemple, si je crée un object d'annotation

header de file

 @interface someViewController: UIViewController { Annotation *annotation; } @property (nonatomic, retain) Annotation *annotation; @end 

Fichier d'implémentation

 @implementation someViewController @synthesize annotation @end 

Question: Est-ce l'approche correcte si j'initialise mon object d'annotation dans le file d'implémentation comme ceci?

 self.annotation = [[Annotation alloc] initWithCoordinate:location]; 

Ai-je besoin de configurer autorelease pour cela? Ou puis-je le faire normalement et append la version dans la méthode dealloc?

    c'est correct:

    self.annotation = [[[Annotation alloc] initWithCoordinate:location] autorelease];

    car la propriété d'annotation est déclarée en tant que propriété retain, donc l'assigner à celle-ci incrémentera son count de retenue.

    vous aurez également besoin, tout de même, de libérer self.annotation dans -dealloc .

    en bref:

    1. init définira le nombre de retenue à 1;

    2. assignant à self.annotation, le mettra à 2;

    3. autorelease le remettra à 1 lorsque la boucle principale sera à nouveau exécutée;

    4. release dans dealloc mettra le count retain à 0, de sorte que l'object sera désalloué);

    La meilleure façon de penser à l' autorelease est la suivante, à mon avis: autorelease "planifier" une release "automatique" de votre object à un certain point (proche) à l'avenir (généralement lorsque le stream de contrôle revient à la boucle principale, mais les détails sont cachés entre les mains d'Apple).

    autorelease est surtout utile avec init , spécifiquement dans les cas suivants:

    1. lorsque vous init une variable locale, de sorte que vous n'ayez pas besoin de la release explicitement avant qu'elle ne soit hors de scope (la boucle principale le fera pour vous);

    2. lorsque vous renvoyez un pointeur vers un object que vous venez de créer sans en conserver la propriété (cas typique du type create/make* des sélecteurs, le récepteur doit le retain pour en devenir propriétaire);

    3. avec des propriétés qui retain , quand vous leur atsortingbuez un object qu'ils devraient posséder uniquement;

    4. avec des data structures qui incrémentent le nombre de NSMutableArray ( NSMutableArray , NSMutableDictionary , etc.): vous devez généralement autorelease un object nouvellement autorelease lorsque vous l'ajoutez à cette structure de données.

    en dehors du cas 2, il est évident que l'utilisation de l' autorelease vise à améliorer la lisibilité du code et à réduire le potentiel d'erreurs (ce qui signifie que dans tous les autres cas, vous pouvez simplement release explicitement votre object après l'assignation ou fin de la scope).

    lorsque vous utilisez des propriétés, vous devez toujours vérifier si elles sont du type retain ou assign / copy ; Dans le premier cas, l'assignation d'un object nouvellement autorelease à une propriété nécessite généralement une autorelease .

    Quoi qu'il en soit, je suggérerais au less écraser un des nombreux tutoriel sur la memory management pour iOS .

    Autorelease indique à l'object de se libérer avant de quitter la scope.

    Parfois, lorsque vous codez, vous rencontrerez quelque chose comme ça

     - (void)doSomething { if(true) { NSSsortingng *foo = [[NSSsortingng alloc] initWithSsortingng:@"foo"]; //Some execution here [foo release]; } } - (void)doSomething { if(true) { //By doing this is telling to to release foo object before getting out of the scope //which is similar with above practice NSSsortingng *foo = [[[NSSsortingng alloc] initWithSsortingng:@"foo"] autorelease]; //Or you can do it this way NSSsortingng *foo = [[NSSsortingng alloc] initWithSsortingng:@"foo"]; [foo autorelease]; //Some execution carry on, it'll release foo before entering next scope } 

    // Ceci est hors de la scope}

    Bien sûr, libérer un object ne signifie pas libérer l'object. Parfois, vous conservez l'object pour pouvoir l'utiliser en dehors de sa scope.

    A en juger par votre question, si votre object est situé dans votre file d'en-tête / interface. Vous devriez le libérer dans la méthode dealloc. CMIIW.