Question

Je l'ai lu sur autoreleasepool mais il y a un point qui est un peu clair pour moi. J'ai quelques fonctionnalités à l'aide des fils qui nécessitent de la mémoire séparée managment en utilisant autoreleasepool.

Dans l'exemple suivant est correct

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = @"Hello";

   [pool release];
}

Est-ce correct?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [pool release];
}

ou cela?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [myString release];
   [pool release];
}

Ma question est propriété des objets créés dans le cadre de la nécessité de la piscine autorelease à relased spécifiquement ou sont les soins apportés quand la autorelasepool est été libéré?

Teo

Était-ce utile?

La solution

AutoRelease poignées de piscine les objets autoreleased. Si vous possédez un objet (via alloc ou copier ou conserver), vous devez libérer. Donc, votre 2ème exemple n'est pas correct. Comme vous l'avez attribué la chaîne, vous possédez et vous devez la libérer.

Une piscine autorelease est créé pour le thread principal. (Vous pouvez regarder dans la fonction principale si vous voulez). Chaque thread a besoin de sa propre piscine autorelease pour gérer les objets autoreleased. Voilà pourquoi si vous créez un autre thread, vous devez créer un pool autorelease pour ce thread. Même si vous ne créez pas l'objet autoreleased dans le thread, vous devez créer ce que les appels bibliothèque dans ce thread peut créer des objets autoreleased. Même si vous êtes sûr qu'aucun appel bibliothèque font des objets autoreleased alors vous devriez aussi les créer comme c'est la meilleure pratique, surtout si vous travaillez sur le grand projet qui est développé et maintenu par plusieurs personnes.

Autres conseils

Il vous suffit de créer votre propre piscine autorelease lorsque vous créez un groupe de objets autoreleased vous voulez ordures Collect immédiatement. Cependant, vous avez raison dans ce que vous ne voulez pas faire référence à une « autoreleased » objets que vous créez après avoir relâché la piscine. objets autoreleased (que vous ne conserviez) sont détruits lorsque la piscine est évacuée.

Étant donné qu'aucun des objets dans votre exemple sont autoreleased, la création de votre propre piscine autorelease est essentiellement un no-op.

Aucun de vos exemples a besoin d'une piscine autorelease. piscines autorelease ne prennent soin des objets autoreleased:

NSArray *foo = [NSArray array];
NSObject *bar = [[[NSObject alloc] init] autorelease];

Votre première chaîne est initialisé par un respect littéral de chaîne et est donc probablement spéciale avec la gestion de la mémoire (peut-être quelqu'un d'autre sait plus). Votre deuxième fuites de chaîne, la piscine ne fait pas de différence. Votre troisième chaîne est sorti correctement, encore une fois la piscine ne fait pas de différence.

est où vous auriez besoin d'une piscine:

- (void) someMethodThatRunsOnAThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *foo = [@"foo" uppercaseString];
    [pool drain];
}

Voici la chaîne de foo fuirait si la piscine était pas là. Notez que j'appelle drain au lieu de release sur la piscine -. Sur iOS il n'y a pas une différence, mais dans les environnements les déchets collectés-deux sont différents, donc il est probablement préférable de prendre l'habitude d'appeler la bonne

Notez également que vous pouvez avoir besoin d'une piscine, même si vous ne vous AutoRelease tout des objets, il pourrait y avoir de nombreuses opérations de mémoire fait quelque part dans le code que vous appelez dans votre méthode.

Pensez que cela devrait être quelque chose comme ceci:

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];


   NSString *myString = [[[NSString alloc] initWithString:@"Hello"] autorelease];

   // or create string like this (automatically autoreleased)
   NSString *myString = [NSString stringWithString:@"Hello"];

   [pool release];
}

Vous devez envoyer un message autorelease, à des objets à l'intérieur de la piscine autorelease. Ils seront libérés lorsque le message de libération est envoyé à la piscine.

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