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?
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
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