Je travaille sur une application et il me reste 1 fuite. L'objet divulgué est NSAutoreleasePool, la taille est de 32 octets. Dans la pile, seules les méthodes de fondation sont appelées. Je n'ai aucune idée de comment résoudre ce problème.Fuite NSAutoreleasePool
Dans le simulateur aucune fuite signalée, sur l'appareil seulement cette fuite.
Une idée est?
Le autoreleasepool est celui que je définis moi-même.
Dans mon viewcontroller j'appelle:
[self performSelectorInBackground:@selector(getDetailInfo:) withObject:self.infoID];
C'est getDetailInfo:
- (void)getDetailInfo:(NSString *)theID {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
DetailInfo *info = [[DataProvider sharedInstance] getDetailInfo:theID]; //the return object is autoreleased.
[self performSelectorOnMainThread:@selector(updateViewWithDetailInfo:) withObject:info waitUntilDone:NO];
[pool release];
}
Quelques infos supplémentaires:
Pour les tests que j'ai changé mes méthodes qui ont été appelés à l'aide performSelectorInBackground pour exécuter sur le thread principal et retiré ces autoreleasepools.
J'ai toujours reçu la fuite sur le NSAutoreleasePool. Aujourd'hui, j'ai appris que vous pouvez afficher le "nom de la bibliothèque" dans la pile des instruments. :-) Je l'ai copié ci-dessous et vous pouvez voir le MapKit en ligne 6 et 7.
0 libSystem.B.dylib calloc
1 libobjc.A.dylib _internal_class_createInstanceFromZone
2 libobjc.A.dylib class_createInstance
3 CoreFoundation +[NSObject(NSObject) allocWithZone:]
4 Foundation +[NSAutoreleasePool allocWithZone:]
5 CoreFoundation +[NSObject(NSObject) alloc]
6 MapKit TileCachePrivate::runCacheThread()
7 MapKit _runCacheThread(void*)
8 libSystem.B.dylib _pthread_start
9 libSystem.B.dylib thread_assign_default
Ce code pour le MapView:
MKMapView *omgeving = [[MKMapView alloc] initWithFrame:CGRectMake(11, 22, 298, 297)];
omgeving.delegate = nil;
[self addSubview:omgeving];
[omgeving release];
Si je commente le code MapView, pas de fuite . Si je le laisse, j'ai la fuite.
Leaked Object # Address Size Responsible Library Responsible Frame
NSAutoreleasePool 0x6a52e50 32 Foundation +[NSAutoreleasePool allocWithZone:]
Merci pour tous les commentaires jusqu'ici. Des suggestions?
Où se trouve le pool d'autorelease? Est-ce celui de main.m? Ou est-ce celui que vous définissez vous-même. Si tel est le cas, vous devez vidanger ou libérer la piscine autorelease lorsque vous avez terminé avec elle. – DHamrick
DHamrick a raison. Pouvez-vous nous montrer le code où vous répartissez la piscine que vous fuyez et où vous la videz? – Ryan
J'ai modifié le post pour inclure le code avec autoreleasepool. – McDJ