2010-03-31 4 views
0

Je détachez un nouveau threadEXC_BAD_ACCESS avec NSAutoreleasePool

[NSThread detachNewThreadSelector:@selector(loadAvatar) toTarget:self withObject:nil]; 

Je reçois un EXC_BAD_ACCESS sur

STObject* st = [cellitem get:@"stobject"]; 

Dans ma méthode suivante

-(void)loadAvatar 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    STObject* st = [cellitem get:@"stobject"]; 
    //do stuff... 
    [pool release]; 
} 

J'ai essayé retenir saint, mais pas la chance. Quand je cours ce code sans détacher un nouveau fil, je n'ai aucun problème. Je ne suis pas vraiment sûr de ce qui me manque. Cellitem est une sous-classe de NSObject qui contient des propriétés telles qu'un dictionnaire et des chaînes.

La méthode get renvoie essentiellement une chaîne à partir d'un dictionnaire

+0

Obtenez-vous le segfault précisément sur l'appel 'get:'? Qu'est-ce que 'cellitem'? – zoul

+0

cellitem est une sous-classe de NSObject qui contient des propriétés telles qu'un dictionnaire et des chaînes. La méthode get renvoie fondamentalement une chaîne à partir d'un dictionnaire. –

Répondre

3

retenue st ne va pas vous faire beaucoup de bien, car l'erreur provient de EXC_BAD_ACCESS avant que la cession a lieu. Le problème réside soit dans l'accès à cellItem, soit dans votre méthode get. De toute façon, vous essayez probablement d'accéder à un objet qui a déjà été libéré. Essayez d'exécuter Instruments avec zombie detection enabled.

1

Je ne sais pas exactement pourquoi cette solution fonctionne, mais j'ai dit à mon fil de dormir pendant 0,1 secondes et il semble résoudre tous les problèmes.

[NSThread detachNewThreadSelector:@selector(loadAvatar) toTarget:self withObject:nil]; 
    [NSThread sleepForTimeInterval:0.1]; 

Est-ce que quelqu'un sait pourquoi? Je suppose que dormir empêche un objet d'être libéré trop tôt? Peut-être une solution hacky.

+1

Je ferais attention à régler un correctif que vous ne comprenez pas complètement. Il y a de fortes chances que vous n'ayez pas vraiment résolu le problème, mais que vous l'ayez simplement masqué temporairement. Avez-vous essayé d'activer la détection de zombies pour déterminer quel objet vous envoyiez après la publication? – glorifiedHacker

+0

La détection de zombies montrait cellitem, mais j'ai retracé le code et il est publié correctement (ou du moins je pense). Où iriez-vous d'ici? –

+1

Vous devez simplifier le code jusqu'à ce que vous compreniez ce qui se passe ou jusqu'à ce que vous puissiez publier les détails ici afin que nous n'ayons pas à deviner. – zoul