2010-06-16 7 views
0

J'essaie d'appeler objectForKey: sur un ivar nsdictionary, mais j'obtiens une erreur EXC_BAD_ACCESS. Le nsdictionary est créé à l'aide de la structure JSON, puis conservé. La première fois que je l'utilise (juste après que je l'ai créée, même boucle d'exécution) cela fonctionne parfaitement bien, mais quand j'essaie d'y accéder plus tard, rien ne fonctionne. Je fais ce code pour essayer de comprendre ce qui est faux:NSDictionary provoquant EXC_BAD_ACCESS

if (resultsDic == nil) { 
    NSLog(@"results dic is nil."); 
} 
if ([resultsDic respondsToSelector:@selector(objectForKey:)]) { 
    NSLog(@"resultsDic should respond to objectForKey:"); 
} 

Le dictionnaire est jamais nul, mais il se bloque toujours sur respondsToSelector. des idées?

outre: Ce sont les autres endroits, en plus haut, que le dictionnaire s'interagi avec:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    [connection release]; 

    //get the data in a usable form 
    NSString *jsonString = [[NSString alloc] initWithData:downloadedData encoding:NSUTF8StringEncoding]; 
    resultsDic = [jsonString JSONValue]; 

    [self processResults]; 

    NSLog(@"Success. Received %d bytes of data",[downloadedData length]); 
    [downloadedData release]; 
    [jsonString release]; 
} 



- (void)processResults 
{ 
     NSArray *resultsArr = [resultsDic objectForKey:@"results"]; 
       CLLocationCoordinate2D coordinate = [self coordinateFromResult:[resultsArr objectAtIndex:0]]; 
     NSLog(@"lat: %f lng: %f", coordinate.latitude, coordinate.longitude); 
} 

- (void)dealloc { 
    [resultsDic release]; 
    [super dealloc]; 
} 
+0

Avez-vous utilisé le débogueur et vérifié que 'resultsDic' contient encore une référence valide/est toujours un dictionnaire? –

+0

il est dit qu'il y a 0 paires clé/valeur. mais comment auraient-ils pu s'en aller, le dictionnaire est censé être conservé? – aks

Répondre

0

Après somethings conserver le nombre est réduit à 0, l'objet sera désallouée. Ce n'est pas la même chose que de le définir à zéro. Ce ne sera pas nul. Alors que vous pouvez envoyer des messages à zéro, l'envoi d'un message à un objet libéré entraînera une erreur EXC_BAD_ACCESS. Si vous publiez une partie du code où il est créé et utilisé, nous pouvons peut-être vous aider à le déboguer. Essayez de le conserver deux fois au début. C'est une solution élégante, mais cela pourrait fonctionner comme une solution rapide.

+0

ah, merci pour l'explication. l'ajout d'une retenue juste après sa création fait fonctionner, maintenant je dois vérifier les fuites. l'outil zombie est grisé pour moi mais je vais le faire tourner aussi – aks

+0

Selon l'instrument de fuite, le dictionnaire ne fuit pas. Cela signifie-t-il que j'aurais dû le conserver de toute façon et que la retenue que j'ai ajoutée est nécessaire? – aks

+0

Très probablement. Si tout le monde suit les règles appropriées, le dictionnaire que vous avez récupéré aura été auto-libéré (c'est pourquoi vous avez été capable de travailler immédiatement, mais il a été désalloué plus tard). Donc, si vous voulez le garder, le conserver. – bobDevil

0

Cela ressemble à un zombie classique. Exécutez-le à nouveau avec la variable d'environnement NSZombieEnabled définie sur YES (ou utilisez l'outil Zombies dans Instruments.app). Cela devrait vous donner beaucoup plus d'informations sur ce qui se passe.

+0

merci, je ne savais pas à propos de cet outil (assez gros Noob ici) – aks