2010-08-06 84 views
0

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

然後它崩潰。它並不能幫助我找到任何可以發現的可捕獲的錯誤。

任何人都可以想到的原因?

回答

2

編輯路易斯在評論中說,除非關鍵與@開始-[NSDictionary valueForKey:]將轉發到objectForKey:的一個指出。 Source但是,我仍然將它改爲使用objectForKey:僅用於語義清晰。使用objectForKey:代替valueForKey:。它們具有非常不同的語義和實現。 valueForKey:@"headerTitle"將尋找一個名爲headerTitleNSDictionary方法,並返回該方法的結果(或者如果它不存在,則可能會崩潰),而objectForKey:實際上會在字典的哈希表結構中查找內容,以查找您「重新尋找。

+1

+1。具體而言,'valueForKey:'是NSObject類別中的鍵值編碼方法。 'objectForKey:'是'NSDictionary'特定的方法想要的。 – kperryua 2010-08-06 21:27:16

+0

好的,注意到 - 但爲什麼代碼在該循環(包含註釋掉的NSLog的循環)被添加時工作? – 2010-08-06 23:38:42

+0

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

1

- [NSDictionary valueForKey:@「Foo」]實際上爲你調用 - [NSDictionary objectForKey:@「Foo」]。

所以要麼NSDictionaries工作。

至於崩潰,當你在調試器中運行它時,你沒有看到堆棧跟蹤? poiCategories是一個分配/引入的NSMutableArray?