代码之家  ›  专栏  ›  技术社区  ›  Don Jones

iPhone/Objective-C数组枚举崩溃

  •  0
  • Don Jones  · 技术社区  · 16 年前

    这有点复杂。

    我创建了一个名为PointsOfInterest的数组(NSarray)。

    这个数组的元素是nsdictionary对象。每个字典都有两个键,“headerTitle”和“rowObjects”。“headerTitle”的值是一个简单的nsstring;“rowObjects”的对象是另一组对象;每一个都是一个自定义类。

    请参见下面的代码。

    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 回复  |  直到 16 年前
        1
  •  2
  •   Dave DeLong    16 年前

    编辑 路易斯在一条评论中指出 -[NSDictionary valueForKey:] 将转发到 objectForKey: 除非钥匙以 @ . Source 不过,我还是会把它改成 对象: 只是为了语义清晰。

    使用 对象: 而不是 valueForKey: . 它们有非常不同的语义和实现。 valueForKey:@"headerTitle" 会找一个 NSDictionary 方法称为 headerTitle 并返回该方法的结果(或者如果它不存在,则可能崩溃),而 对象: 实际上,在字典的散列表结构中查找内容,以查找要查找的对象。

        2
  •  1
  •   Firoze Lafeer    16 年前

    -[nsDictionary ValueForkey:@“foo”]实际为您调用-[nsDictionary Objectforkey:@“foo”]。

    所以这两个都适用于nsdictionaries。

    至于崩溃,当您在调试器中运行它时,您是否没有看到堆栈跟踪?POICategories是一个已分配/初始化的nsmutableArray?