这有点复杂。
我创建了一个名为pointsOfInterest的数组(NSArray)。
此数组的元素是NSDictionary对象。每个字典都有两个键,“headerTitle”和“rowObjects”。 “headerTitle”的值是一个简单的NSString; “rowObjects”的对象是另一个NSArray对象;每个都是一个自定义类。
请参阅下面的代码。
for (NSDictionary *dict in pointsOfInterest) {
NSArray *keys = [dict allKeys];
for (NSString *key in keys) {
//NSLog(@"Key %@",key);
}
NSString *category = [dict valueForKey:@"headerTitle"];
[poiCategories addObject:category];
}
所以,我通过数组枚举,将单个字典对象放入dict中。然后我运行它的所有键 - 如果我取消注释NSLog行,它将显示如下:
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
然后构造一个新的扁平数组,其中包含所有“headerTitle”键的值。
首先,我很清楚我应该能够做到这一点:
poiCategories = [[pointsOfInterest valueForKey:@"headerTitle"] retain]
获取各种“headerTitle”键的值。但是,这样做会导致应用程序崩溃。奇怪的是,上面的构造工作正常......如果我留在内部for循环。如果我删除for循环及其无用的NSLog,只留下:
for (NSDictionary *dict in pointsOfInterest) {
NSString *category = [dict valueForKey:@"headerTitle"];
[poiCategories addObject:category];
}
然后它崩溃了。它没有给我带来任何我能找到的任何可捕获的错误。
任何人都可以想到的任何理由?
答案 0 :(得分:2)
编辑路易斯在其中一条评论中指出-[NSDictionary valueForKey:]
将转发至objectForKey:
,除非密钥以@
开头。 Source但是,为了语义清晰,我仍然会将其更改为使用objectForKey:
。
使用objectForKey:
代替valueForKey:
。它们具有非常不同的语义和实现。 valueForKey:@"headerTitle"
将查找名为NSDictionary
的{{1}}方法并返回该方法的结果(如果它不存在,可能会崩溃),而headerTitle
实际上会并查找字典的哈希表结构中的内容,以找到您正在寻找的对象。
答案 1 :(得分:1)
- [NSDictionary valueForKey:@“Foo”]实际上为你调用了[NSDictionary objectForKey:@“Foo”]。
所以要么适用于NSDictionaries。
至于崩溃,当你在调试器中运行它时,你没有看到堆栈跟踪? poiCategories是一个已分配/被引入的NSMutableArray?