2010-08-06 5 views
0

C'est un peu complexe.Échecs d'énumération de tableaux iPhone/Objective-C

J'ai créé un tableau (NSArray) appelé pointsOfInterest.

Les éléments de ce tableau sont des objets NSDictionary. Chaque dictionnaire a deux clés, "headerTitle" et "rowObjects". La valeur de "headerTitle" est un simple NSString; l'objet pour "rowObjects" est un autre NSArray d'objets; chacun d'entre eux est une classe personnalisée.

Voir le code ci-dessous. Donc, j'énumère à travers le tableau, obtenant des objets de dictionnaire individuels en dict. Je lance alors à travers toutes ses clés - si je décommenté la ligne NSLog, il afficherait quelque chose comme ceci:

2010-08-06 14:00:17.236 TourGuide[4479:207] Key headerTitle 
2010-08-06 14:00:17.237 TourGuide[4479:207] Key rowObjects 
2010-08-06 14:00:17.238 TourGuide[4479:207] Key headerTitle 
2010-08-06 14:00:17.239 TourGuide[4479:207] Key rowObjects 

Il construit alors un nouveau tableau plat, contenant les valeurs de toutes les clés « headerTitle » .

D'abord, je suis bien conscient que je devrais être en mesure de le faire:

poiCategories = [[pointsOfInterest valueForKey:@"headerTitle"] retain] 

Et obtenir les valeurs des différentes touches « headerTitle ». Faire cela, cependant, bloque l'application. Ce qui est bizarre, c'est que ce qui précède pour la construction fonctionne bien ... SI je pars dans la boucle interne. Si je supprime cette boucle, et son inutile NSLog, laissant juste ceci:

for (NSDictionary *dict in pointsOfInterest) { 
    NSString *category = [dict valueForKey:@"headerTitle"]; 
    [poiCategories addObject:category]; 
} 

Puis il se bloque. Il ne me bénit avec aucune sorte d'erreur piégeable que je peux trouver.

Une raison pour laquelle quelqu'un peut penser?

Répondre

2

modifier Louis a fait remarquer dans l'un des commentaires qui -[NSDictionary valueForKey:] transmettra à objectForKey: à moins que la clé commence par @. Source Cependant, je changerais encore pour utiliser objectForKey: juste pour la clarté sémantique.

Utilisez objectForKey: au lieu de valueForKey:. Ils ont des sémantiques et des implémentations très différentes. valueForKey:@"headerTitle" va chercher une méthode NSDictionary appelée headerTitle et retourner le résultat de cette méthode (ou si elle n'existe pas, va probablement tomber en panne), alors que objectForKey: va réellement et regarde des choses dans la structure de table de hachage du dictionnaire pour trouver l'objet re cherche.

+1

+1. Pour être précis, 'valueForKey:' est une méthode Key-Value Coding dans une catégorie NSObject. 'objectForKey:' est la méthode spécifique 'NSDictionary' que veut want. – kperryua

+0

Ok, noté - mais pourquoi le code fonctionne-t-il lorsque cette boucle (celle contenant le NSLog commenté) est ajoutée? –

+0

valueForKey: et objectForKey: ont des sémantiques différentes, mais dans le cas de NSDictionary, valueForKey: ne fait pas ce que vous prétendez.Il appellera réellement objectForKey: à moins que la chaîne ne commence par un @, ce qui signifie qu'il fera ce qu'il pense. Il n'appellera que l'implémentation super (qui tentera l'appel de méthode) si vous essayez d'obtenir la valeur de la clé @ "@ headerTitle". Voir http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDictionary/valueForKey: –

1

- [NSDictionary valueForKey: @ "Foo"] appelle réellement - [NSDictionary objectForKey: @ "Foo"] pour vous.

Donc soit fonctionnera pour NSDictionaries.

En ce qui concerne les plantages, lorsque vous exécutez ce programme dans le débogueur, ne voyez-vous pas une trace de pile? poiCategories est un NSMutableArray alloué/initié?

Questions connexes