2010-07-04 4 views
1

Je lisais le Guide de gestion de mémoire pour iPhone OS et je n » boucle comprends un point dans la section Pools Autorelease Listing - 1 exemple de code:Piscines AutoRelease dans un pour le « contexte de

void main() 
{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSArray *args = [[NSProcessInfo processInfo] arguments]; 

for (NSString *fileName in args) { 

    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init]; 

    NSError *error = nil; 
    NSString *fileContents = [NSString stringWithContentsOfFile:fileName 
             encoding:NSUTF8StringEncoding error:&error]; 

    /* Process the string, creating and autoreleasing more objects. */ 

    [loopPool release]; 
} 

/* Do whatever cleanup is needed. */ 
[pool drain]; 

exit (EXIT_SUCCESS); 
} 

Il dit En outre, tous les objets auto-libérés créés dans le contexte de la boucle for (comme fileName) sont libérés lorsque loopPool est libéré même s'ils ne sont pas explicitement envoyés un message autorelease. "

Le point que je ne comprenais pas comment la variable fileName est inclus dans la deuxième piscine (loopPool), mais pas le premier (piscine). Le nom de fichier n'est-il pas créé lorsque le premier pool est le pool le plus haut de la pile de pools?

Répondre

2

Vous avez raison. fineName est dans le pool externe. Si c'est comme ça dans les docs, c'est un bug.

Edit: Ne hésitez pas à déposer un rapport de bogue au système radar d'Apple.

+1

Vous avez raison, semble comme il devrait être 'fileContents' à la place! Vraiment, assurez-vous de déposer un bug afin que les autres n'auront pas à faire face à cette question eux-mêmes (ou même croire cela!). – bddckr

+0

En réalité, fileName peut ne pas appartenir à un pool de libération automatique. L'énumération rapide nécessite que la collection crée un tableau C des objets à énumérer. Comme il a déjà la propriété de ces objets, il n'a pas besoin de les libérer automatiquement car il les place dans le tableau. Étant donné que l'objet ProcessInfo est un singleton, il est probablement pas dans une piscine de dégagement automatique et peut-être aucune de ses propriétés sont, y compris le tableau d'arguments. – JeremyP

Questions connexes