2010-05-24 7 views
2

Bien qu'il ne semble pas poser de problème sur le simulateur, l'utilisation de performSelectorInBackground sur le périphérique provoque des fuites de mémoire. Ou du moins c'est ce que les Instruments indiquent. En regardant le code, je n'ai pas la moindre idée de ce que la cause pourrait être. J'ai essayé de supprimer le code affecté au strict minimum, mais étrangement, Instruments continue d'afficher une fuite chaque fois que ce code est exécuté.PerformSelectorInBackground qui fuit sur le périphérique

Rien d'inhabituel ici?

//In viewcontrollerA: 
    -(void)mainLoop 
    { 
    [self.viewControllerB performSelectorInBackground:@selector(calculateTotals) withObject:nil]; 

      //This gives the same problem 
     //[NSThread detachNewThreadSelector:@selector(calculateTotals) toTarget:self.viewControllerB withObject:nil]; 

      //UI stuff ... 

    } 

    //viewControllerB: 
    -(void)calculateTotals 
    { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    //Heavy calculations ... 


    [pool release]; 
    } 

Edit: Je suis toujours sur cette question et il semble que la fuite est causée par le fait que quelque part en bas de la pile [NSThread start] est jamais suivi de [sortie NSThread]. Donc, il semble qu'il y ait de temps en temps un fil qui continue de tourner sans jamais le terminer. Maintenant, ma question est: y a-t-il quelque chose que je pourrais faire pour mettre fin à ces menaces «suspendues» manuellement?

+0

De quel type d'objet les fuites sont-elles l'objet? – kperryua

+0

Ma supposition spontanée est que c'est un cycle de conservation de performSelectorInBackground en conservant sa cible, cet article pourrait être utile: http://www.mikeash.com/pyblog/friday-qa-2010-04-30-dealing- with-retain-cycles.html –

+0

@kperryua Il dit que les fuites proviennent de 'GeneralBlock-3584', en creusant vers le bas il révèle que les appels resposables sont - [NSThread start] et + [NSThread exit]. Je ne peux pas vraiment faire ce que ça veut dire? – Oysio

Répondre

0

Peut-être qu'un de vos threads émet une exception? Les exceptions dans les threads ne sont pas signalées dans la console de débogage, vous devez attraper l'exception dans le thread.

Questions connexes