J'ai une question liée à la gestion de la mémoire dans une application iPhone multithread. Disons que nous avons cette méthode, qui est appelé dans un thread séparé de la main-UI-fil:L'application iPhone multithread se bloque avec [NSAutoreleasePool release]
- (BOOL)fetchAtIndex:(NSUInteger)index
{
NSURL *theURL = [NSURL URLWithString:[queryURLs objectAtIndex:index]];
// Pay attention to this line:
NSData *theData = [[NetworkHelper fetchFromNetwork:theURL] retain];
// Some code here...
// Now what should I do before returning result?
//[theData release]; ??
//[theData autorelease]; ??
return YES;
}
Comme vous pouvez le voir, je retiens la NSData
je suis revenu de mon opération réseau. La question est: pourquoi ne devrais-je pas la libérer (ou la libérer automatiquement) à la fin de ma méthode? La seule façon dont je l'ai fait fonctionner est d'utiliser retain
au début, et rien alors. Si j'utilise une autre combinaison (rien du tout: retain
puis release
ou autorelease
), mon programme se bloque avec EXC_BAD_ACCESS
lorsque je libère le thread NSAutoreleasePool
. Qu'est-ce qui me manque?
Pour votre information, voici le code principal du fil:
- (void)threadedDataFetching;
{
// Create an autorelease pool for this thread
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Reload data in separate thread
[self fetchAtIndex:0];
// Signal the main thread that fetching is finished
[self performSelectorOnMainThread:@selector(finishedFetchingAll) withObject:nil waitUntilDone:NO];
// Release all objects in the autorelease pool
[pool release]; // This line causes EXC_BAD_ACCESS
}
Merci pour votre aide!
Merci. En effet, fetchFromNetwork était comme votre deuxième exemple de code: NSData * data = [otherObject dataFromOtherObject]; ... return [données autorelease]; // Mauvais ici! C'est pourquoi j'ai dû le conserver dans mon code client. J'ai supprimé le mauvais appel -autorelease, puis le code -retain sur le côté client, et maintenant tout va bien. Merci! – Romain