这有点复杂。iPhone/Objective-C数组枚举崩溃
我创建了一个名为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];
}
所以,我通过数组枚举,将单个字典对象变为字典。然后,我通过它的所有关键字的运行 - 如果我注释掉了的NSLog线,就成了显示是这样的:从所有的“headerTitle”键
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
然后,它构建了一个新的,平坦的数组,其中包含的值。
首先,我很清楚地知道,我应该能够做到这一点:
poiCategories = [[pointsOfInterest valueForKey:@"headerTitle"] retain]
,并获得价值的各种“headerTitle”键。但是,这样做会导致应用程序崩溃。奇怪的是,上面的构造工作正常......如果我离开内部for循环。如果我删除那个for循环,它的无用的NSLog,只留下这个:
for (NSDictionary *dict in pointsOfInterest) {
NSString *category = [dict valueForKey:@"headerTitle"];
[poiCategories addObject:category];
}
然后它崩溃。它并不能帮助我找到任何可以发现的可捕获的错误。
任何人都可以想到的原因?
+1。具体而言,'valueForKey:'是NSObject类别中的键值编码方法。 'objectForKey:'是'NSDictionary'特定的方法想要的。 – kperryua 2010-08-06 21:27:16
好的,注意到 - 但为什么代码在该循环(包含注释掉的NSLog的循环)被添加时工作? – 2010-08-06 23:38:42
valueForKey:和objectForKey:具有不同的语义,但在NSDictionary的情况下valueForKey:不会做你声称的。它实际上会调用通过objectForKey:除非你的字符串以@开头,这意味着它会做他认为的事情。如果您尝试获取键“@ headerTitle”的值,它只会调用超级实现(它将尝试方法调用)。请参阅http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDictionary/valueForKey: – 2010-08-07 20:04:29