2010-11-23 5 views
1

Je sais qu'une question similaire a déjà été résolue avant here, mais je veux juste m'assurer que je la comprends un peu mieux. Voici mon scénario ...Clarification sur la gestion de la mémoire IPhone (Autorelease)

J'ai une méthode de classe d'aide qui retourne un UIImageView alloué, comme on le voit ci-dessous.

+(UIImageView *)tableCellButton{ 
return [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]] autorelease]; 

}

Puis, dans un de mes méthodes de UIViewController je l'utilise en tant que tel ..

UIImageView *imageView = [Helper tableCellButton]; 
imageView.frame = cell.backgroundView.bounds; 
imageView.tag = 250; 
[cell.backgroundView addSubview:imageView]; 

Ma question est en ce qui concerne la façon dont cette mémoire est libérée. Je n'utilise pas un pool autorelease (autre que l'application créée), et la variable n'est pas un iVar/Property (donc il ne sera pas libéré quand dealloc est appelé). Dans ce cas, suis-je responsable de libérer la mémoire après l'avoir appelée? Quand est-ce que autorelease entre en jeu? Merci pour l'aide!

+1

Voir cette question ici quand les [Communiqués de AutoreleasePool] (http://stackoverflow.com/questions/581828/autorelease-scope). J'espère que cela vous donnera un aperçu. Vous n'aurez jamais besoin de 'release 'et d'objet' auto-released '. Il ne survivra probablement que par" event "s'il est créé lors d'une pression sur un bouton, ou tant que' cell.backgroundView' persiste ('addSubview 'retains.) –

+0

à droite sur la version ... Donc, le seul pool autorelease dans mon application est celui qui réside dans le principal. Puisque c'est le cas, cela cause-t-il une fuite, ou cet objet recevra-t-il une version quand le ViewController nettoiera la table et les cellules? – DerekH

+0

Merci pour vos réponses! J'ai également trouvé les docs de gestion de la mémoire pour iOS (je ne sais pas comment je les ai manqués avant). http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1 – DerekH

Répondre

1

Un appel à autorelease provoquera l'envoi de release à l'objet la prochaine fois via la boucle d'événements. Cela tiendra compte de l'appel alloc que vous faites dans tableCellButton. La seule autre fois que l'objet est conservé est à l'intérieur de addSubview, qui va également gérer ses propres release du même objet. Basé sur le code ci-dessus, alors, la gestion de la mémoire de cet objet vérifie.

1

Chaque itération du runloop possède son propre pool de libération automatique.

Essentiellement, penser comme ceci:

while(1) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    [someObject doSomething]; 
    [pool drain]; 
} 
+0

Lorsque l'application est en cours d'exécution, un pool d'autorelease est-il créé pour chaque événement, ou juste celui global dans main? – DerekH

+1

Chaque événement. Cela signifie que lorsque l'événement est terminé, le pool autorelease est drainé et un nouveau est créé. Il y a un pool d'autorelease dans main, mais c'est en fait un catchall final avant la fin du programme. –

Questions connexes