2010-11-11 26 views
0

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?

+0

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

+0

DHamrick a raison. Pouvez-vous nous montrer le code où vous répartissez la piscine que vous fuyez et où vous la videz? – Ryan

+0

J'ai modifié le post pour inclure le code avec autoreleasepool. – McDJ

Répondre

0

J'ai trouvé une fuite NSAutoreleasePool souvent des points à la mauvaise NSAutoreleasePool. Utilisez-vous un NSAutoreleasePool dans getDetailInfo de DataProvider? Qu'en est-il de l'appelant? J'ai lu auparavant que drainer un NSAutoreleasePool externe est supposé drainer ceux internes, mais je n'ai pas trouvé que ce soit le cas.

... De même, drain est préféré à release sur NSAutoreleasePool. Ce n'est pas votre problème, cependant.

+0

Je n'utilise pas NSAutoreleasePool dans le DataProvider. Je fais un appel SOAP dans le DataProvider, analyse JSON, crée un objet autoreleased et le renvoie à viewController. Ensuite, mettez à jour la vue sur le thread principal. – McDJ