【问题标题】:NSMutableArray Extra Nil SentinelsNSMutableArray 额外零哨兵
【发布时间】:2014-06-24 18:26:11
【问题描述】:

我已将文本文件读入字符串数组。在下面的代码中,我从该数组创建对象并将它们添加到 NSMutableArray 中。

NSMutableArray* metaphors = [[NSMutableArray alloc] init];
unsigned int i, cnt = [allLinedStrings count];
for(i = 0; i < cnt-3; i+=5)
{
    Metaphor *newMetaphor = [[Metaphor alloc] init];
    [newMetaphor setMetaphorTitle: allLinedStrings[i]];
    [newMetaphor setCorrectAnswer: allLinedStrings[i+1]];
    [newMetaphor setLiteralAnswer: allLinedStrings[i+2]];
    [newMetaphor setWayOffAnswer: allLinedStrings[i+3]];
    [metaphors addObject:newMetaphor];
}

至于问题,当我通过索引(例如 [隐喻 objectAtIndex:3])访问任何项目时,所有其他元素(奇数编号)都是 nil 元素。但是,所有对象都添加到数组中。我的猜测是 addObject 每次都向数组添加一个元素以及一个新的 nil 哨兵?这应该发生/我应该手动检查并删除这些元素吗?

另外,由于我是 Objective-C 的新手,我的 Metaphor 类包含您可以在正文中看到的 4 个实例字段:如果有人可以的话,我相信有更快的语法来初始化这些对象之一指出我正确的方式。谢谢。

【问题讨论】:

    标签: ios objective-c arrays nsmutablearray


    【解决方案1】:

    NSArray 不能包含 nil。这是无效的。如果您在对数组的调用中返回 nil,则数组指针本身几乎可以肯定是 nil。 (您可以向 Objective C 中的 nil 对象指针发送消息。它只返回 nil/0。)

    尝试将 nil 添加到 NSArray 会导致崩溃,并且尝试索引超过 NSArray 的末尾也会导致崩溃。

    有一个特殊的 NSNull 类,它提供了一个单例占位符对象,可以代替 NSArray 中的 nil 条目。

    【讨论】:

    • 是的,我的问题原来与读取文件有关,而不是与将对象添加到数组中有关。谢谢。
    【解决方案2】:

    nil sentinel 只是一种知道已到达可变长度数组的最后一个元素的方法。 nil sentinel 没有添加到 NSMutableArray;

    NSMutableArray addObject 方法不需要 nil 标记,因为您只添加一个对象,而不是可变长度数组。

    如果你需要在数组中添加一些“nil”,你可以使用 [NSNull null],它是一个“等价于 nil”的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2019-11-10
      相关资源
      最近更新 更多