2014-06-24 75 views
0

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

至于问题,当我通过索引来访问的任何项目([隐喻objectAtIndex:3]例如)所有其他元素(奇数的)是零元素。尽管如此,所有的对象都被添加到数组中。我的猜测是,addObject是添加一个元素到数组以及每次都有一个新的零标记?如果发生这种情况/我应该手动通过并删除这些元素?另外一个方面,因为我是新来的Objective-C,我的隐喻类包含4个实例字段,您可以在正文中看到:我确定有更快的语法来初始化这些对象之一,如果有人可以指出我正确的方式。谢谢。

回答

1

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

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

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

+0

是的,我的问题竟然与读取文件有关,而不是将对象添加到数组中。谢谢。 – Connor

1

nil sentinel只是一种知道已达到变长数组最后一个元素的方法。零哨兵不添加到NSMutableArray;

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

如果您需要向数组添加“nil”,您可以使用[NSNull null],它是一个“等于零”的对象。