NSMutableArray Extra Nil Sentinels

时间:2014-06-24 18:26:11

标签: ios objective-c arrays nsmutablearray

我已将文本文件读入字符串数组。在下面的代码中,我从该数组创建对象并将它们添加到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];
}

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

同样是旁注,因为我是Objective-C的新手,我的隐喻类包含了您可以在正文中看到的4个实例字段:我确定有更快的语法来初始化其中一个对象,如果有人能指出我正确的方式。感谢。

2 个答案:

答案 0 :(得分:1)

NSArray不能包含nil。它无效。如果你在调用数组时得到nil,那么数组指针本身几乎肯定是零。 (您可以将消息发送到Objective C中的nil对象指针。它只返回nil / zero。)

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

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

答案 1 :(得分:1)

nil sentinel只是一种了解已达到可变长度数组的最后一个元素的方法。 nil sentinel ISN&#39; T被添加到NSMutableArray;

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

如果你需要添加一些东西&#34; nil&#34;对于一个数组,你可以使用[NSNull null]这是一个对象&#34;相当于nil&#34;。