Je reçois ce message d'erreur dans la console :
\*\*\* \_NSAutoreleaseNoPool(): Object 0x10d2e0 of class NSPathStore2
autoreleased with no pool in place - just leaking
Je n'arrive pas à comprendre quelle est l'erreur ?
Gracias.
Je reçois ce message d'erreur dans la console :
\*\*\* \_NSAutoreleaseNoPool(): Object 0x10d2e0 of class NSPathStore2
autoreleased with no pool in place - just leaking
Je n'arrive pas à comprendre quelle est l'erreur ?
Gracias.
Il s'agit d'un problème classique de gestion de la mémoire : vous libérez automatiquement certains objets sans disposer d'un pool de libération automatique. L'autorelease n'est pas une magie. Il existe un objet de type NSAutoreleasePool
qui garde la trace de tous les objets que vous libérez automatiquement et les libère "de temps en temps" :
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// An autoreleased object referenced by our pool.
id object = [NSNumber numberWithInt:1];
[pool drain];
// Our object no longer valid.
Chaque thread doit avoir son propre pool d'autorelease. C'est assez logique, car les threads s'exécutent "en même temps" et s'ils partageaient un pool d'autorelease commun, ils pourraient libérer un objet alors que vous êtes encore en train de travailler avec lui.
Maintenant, le point. Il existe un pool d'autorelease par défaut dans le thread principal de chaque application, ce qui signifie que vous n'avez pas à penser à tout cela et que les objets autoreleased sont collectés sans problème. Mais si vous créez un autre thread, vous êtes généralement obligé de créer également un pool d'autorelease pour ce thread. Sinon, il n'y a personne pour réclamer les objets autoreleased et ils fuient. C'est exactement la raison pour laquelle vous recevez cet avertissement.
Un fil qui fuit sans pool autorelease peut ressembler à ceci :
- (void) doSomethingInBackground
{
id object = [NSNumber numberWithInt:1];
}
- (void) someOtherMethod
{
[self performSelectorInBackground:@selector(doSomethingInBackground);
}
La solution est simple :
- (void) doSomethingInBackground
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id object = [NSNumber numberWithInt:1];
[pool drain];
}
Il ne vous reste plus qu'à déterminer où vous exécutez du code dans un autre thread.
Il semble que vous ayez créé une méthode dans un nouveau thread (en utilisant éventuellement la méthode + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument;
)
Toute méthode qui s'exécute sur son propre thread devra disposer d'un pool d'autorelease pour récupérer les objets autoreleased :
- (void)myLovelyThreadedMethod
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
... // your code here
[pool release];
}
Essayez d'utiliser le Analyseur statique de Clang
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.