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?
+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
Ok, noté - mais pourquoi le code fonctionne-t-il lorsque cette boucle (celle contenant le NSLog commenté) est ajoutée? –
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: –