這有點複雜。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