iPhone / Objective-C阵列枚举崩溃

时间:2010-08-06 21:16:44

标签: 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];
}

所以,我通过数组枚举,将单个字典对象放入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];
}

然后它崩溃了。它没有给我带来任何我能找到的任何可捕获的错误。

任何人都可以想到的任何理由?

2 个答案:

答案 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?