2010-08-06 83 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?