如何向NSMutableArray中添加nil?

54
NSArray *array = [[NSArray alloc] initWithObjects:@"ΕΛΤΑ",
                      @"ΕΛΤΑ COURIER", @"ACS", @"ACS ΕΞΩΤΕΡΙΚΟ", 
                      @"DHL", @"INTERATTICA", @"SPEEDEX", 
                      @"UPS", @"ΓΕΝΙΚΗ ΤΑΧΥΔΡΟΜΙΚΗ", @"ΜΕΤΑΦΟΡΙΚΕΣ ΕΞΩΤΕΡΙΚΟΥ", nil];

这段代码能够运行是因为它在结尾处有nil。

但是,我像这样添加对象:addObject:name等等... 所以最后我必须添加nil,我使用addObhect:nil来实现,但当我运行应用程序时,它仍然会在cellForRowAtIndexPath:处崩溃。

如何使它正常工作?

好的,我不必添加nil了。

那么我的应用程序崩溃的原因是什么呢?


1
由于您的应用程序在填充UITableView时显然崩溃,因此您应该分享实现cellForRowAtIndexPath的代码。另外,更多关于您遇到的“崩溃”的信息将有所帮助。它是SIG_ABORT还是EXEC_BAD_ACCESS,并且是否有异常(在XCode中检查控制台Shift+Apple+R)。 - Paul Wheeler
1
当您“逐个添加”它们时,无需在末尾添加nil。如果有帮助的话,可以这样想:当您“逐个添加”它们时,nil已经“存在”,系统会自动处理。 - Fattie
1
我不禁感觉mr-sk、mike-weller和akosma的答案应该合并成"正确"的答案。 - llaughlin
9个回答

234

如果必须将nil对象添加到集合中,请使用NSNull类:

 

NSNull类定义了一个单例对象,用于在集合对象中表示空值(不允许使用nil值)。

假设“array”是类型为NSMutableArray

....
[array addObject:[NSNumber numberWithInt:2];
[array addObject:@"string"];
[array addObject:[NSNull null]];

2
对于新手(比如我),以下是一个测试示例,用于检查数组元素是否等于插入的nil值:'if ([self.voice objectAtIndex:indexPath.row] != [NSNull null]) {' (感谢akosma) - tmr

27

你不需要调用[addObject:nil]

initWithObjects:中的nil只是为了告诉方法列表在哪里结束,这是由于C语言varargs的工作方式所致。当你使用addObject:逐个添加对象时,不需要添加一个nil


7
"sentinel" 是指 "哨兵",因为它 "保护" 列表的末尾,以防止事物从末尾迭代。需要知道它被称为哨兵,因为你可能会看到编译器错误或警告,如 "missing sentinel value ..."。在这种情况下,这意味着你忘记在某个东西的末尾添加 nil 了,通常是在使用 initWithObjects 初始化列表时出现。 - Nimrod
所以基本上,如果你在NSMutableArray上使用addObjects方法添加元素,你不需要在末尾添加nil吗?它会自己知道何时到达末尾? - Supertecnoboff

18

在调用addObject时,您不能添加nil


15
如果您真的想在集合中使用Null-ish项目,NSNull就是为此而存在的。

8

您需要添加NSNull类,最佳方法是这样的:

NSArray *array = @[ @"string", @42, [NSNull null] ];

我个人推荐在你的代码设计中使用特定值比如0而不是null或nil,但有时你需要添加null。

这篇苹果官方文档有一个很好的解释。


6

nil被用于终止数组


5

nil不是可以添加到数组中的对象:数组不能包含nil。这就是为什么addObject:nil会崩溃的原因。


2

在添加到数组时,通过这个方法传递你的对象以避免尝试从对象中插入空值导致崩溃。

-(id) returnNullIfNil:(id) obj  {
    return (obj == nil) ? ([NSNull null]) : (obj);
}

[NSNull null] 返回一个表示 nil 的空对象。


0

你不能向一个 NSArray 添加对象,因为该类是不可变的。如果你想在创建后更改数组,必须使用 NSMutableArray


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接