2010-08-09 3 views
4

J'ai utilisé autorelease tout au long de mon application et je voudrais comprendre le comportement de la méthode autorelease. Quand le pool autorelease par défaut est-il vidé? est-il basé sur une minuterie (tous les 30sec?) ou doit être appelé manuellement? Ai-je besoin de faire quoi que ce soit pour publier des variables marquées avec autorelease?Quand le pool autorelease est déclenché

Répondre

5

Il y a (je dirais) 3 cas principaux lors de leur création et de diffusion:

1.Beginning et fin de l'application du cycle de vie, écrit dans main.m

int main(int argc, char *argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

2.Beginning et fin de chaque événement (Fait dans le AppKit)

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
- (void)loadView 
/* etc etc initialization stuff... */ 
[pool release]; 

3.Whenever vous voulez (vous pouvez créer votre propre piscine et le libérer. [from apple memory management document])

– (id)findMatchingObject: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. */ 
} 
+0

Que diriez-vous de sous-fil? Quel est le comportement par défaut si nous ne créons pas le pool explicitement? – jianhua

5

Il est drainé à chaque fois que la boucle d'exécution se termine. C'est quand votre méthode et la méthode appelant votre méthode et la méthode appelant cette méthode et ainsi de suite est tout fait.

De l'documentation:

Le kit d'application crée un pool autorelease sur le thread principal au début de chaque cycle de la boucle d'événements, et les drains à la fin, libérant ainsi des objets autoreleased générés tout le traitement d'un événement

+0

Chaque événement externe déclenche un cycle de la boucle d'exécution, par ex. Evénement de souris, appui sur une touche, réception de données sur une connexion HTTP asynchrone etc. NSTimers également, mais les timers utilisaient un chemin de code légèrement différent pour que le pool de libération automatique ne soit pas drainé jusqu'à la réception d'un événement réel. Cela aurait pu être corrigé maintenant. – JeremyP

Questions connexes