Question

Je comprends que vous devez être prudent avec iOS sur autorelease. J'ai une méthode qui retourne un objet, il s qui est alloc nécessaire par l'appelant, donc dans cette situation - si je comprends bien - je dois envoyer à l'objet retain dans le callee avant qu'il ne revienne.

Cela est bien, mais une fois que le contrôle revient au téléphone (à savoir après mon clic de bouton a été traité), il semble que la piscine autorelease est libéré. Je soupçonne que c'est la façon dont il est censé être, mais je me demande quelle est la meilleure pratique de cette situation.

J'ai eu recours à l'envoi d'un message de l'dealloc appelant afin que l'objet ne soit pas libéré et libérant explicitement dans <=>.

Est-ce la meilleure approche?

Était-ce utile?

La solution

Le pool de libération automatique est typiquement libéré après chaque itération de la boucle d'exécution. En gros, toutes les applications Cocoa et Cocoa Touch est structuré comme suit:

Get the next message out of the queue
Create an autorelease pool
Dispatch the message (this is where your application does its work)
Drain the autorelease pool

Ce que vous décrivez est le comportement attendu. Si vous voulez garder un objet autour plus longtemps que cela, vous aurez besoin de conserver explicitement.

Autres conseils

L'utilisation est un moyen autorelease de dire: « Objet, je ne veux pas que tu plus, mais je vais vous passer à quelqu'un d'autre qui pourrait vouloir vous, alors ne disparaissent pas encore. » Ainsi, l'objet se tenir assez longtemps pour que vous puissiez retourner à partir d'une méthode ou le donner à un autre objet. Quand un code veut garder l'objet autour, elle doit revendiquer sa propriété en elle ing retain.

Voir les directives de gestion de la mémoire pour tout ce que vous devez savoir utiliser correctement <=>.

Voici un examle fourni dans le document de gestion de la mémoire Apple :

– (id)findMatchingObject:(id)anObject 
{ 
    id match = nil; 
    while (match == nil) { 
        NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init]; 
        /* Do a search that creates a lot of temporary objects. */ 
        match = [self expensiveSearchForObject:anObject]; 
        if (match != nil) { 
            [match retain]; /* Keep match around. */ 
        } 
        [subPool release]; 
    } 
    return [match autorelease];   /* Let match go and return it. */ 
}

Oui, c'est la meilleure approche. Autorelease est vraiment uniquement destiné à des interactions dans le code que vous connaissez. Une fois que vous stockez un objet, vous devez savoir que ce soit l'objet qui contient une référence ne mourra pas / hors de portée jusqu'à ce que vous êtes également fait avec l'objet, ou vous avez besoin de conserver l'objet.

Il est garanti que les objets ne autoreleased seront libérés après la fin de votre méthode. Après tout, la méthode appelée méthode aurait pu créer sa propre piscine et libérer juste après votre méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top