iphone - mutableArray无法存储nil对象

Spa*_*Dog 3 iphone iphone-sdk-3.0

我有一个可变数组,保留并存储多个对象.在某些时候,一个对象可能变为零.当发生这种情况时,应用程序将崩溃,因为数组不能有nil对象.想象一下

[object1,object2,object3,nil];

那么,object2 = nil

[object1,nil,object3,nil];

这是不可能的,因为nil是数组标记的结尾.那么,我该如何解决呢?谢谢你的帮助.

Dav*_*ong 9

使用[NSNull null],如果你要存储一个空的占位符对象.

例如:

NSArray * myArray = [NSArray arrayWithObjects:obj1, [NSNull null], obj3, nil];
Run Code Online (Sandbox Code Playgroud)

myArray将包含3个对象.当你检索对象时,你可以做一个简单的指针相等测试,看看它是否是Null单例:

id object = [myArray objectAtIndex:anIndex];
if (object == [NSNull null]) {
  //it's the null object
} else {
  //it's a normal object
}
Run Code Online (Sandbox Code Playgroud)

编辑(回复评论)

@Mike我认为你对实际发生的事情感到困惑.

如果你有:

id obj = ...;
Run Code Online (Sandbox Code Playgroud)

然后obj包含一个地址.它不包含对象.因此,如果你这样做NSLog(@"%p", obj),它会打印出类似的东西0x1234567890.当你放入obj数组时,它不是复制对象,而是复制对象的地址.所以数组实际上包含了0x1234567890.因此,当您稍后执行:时 obj = nil;,您只会影响数组外部的指针.该数组仍将包含0x1234567890.

  • 在那种情况下,你有一个错误.数组中的对象由数组保留.在正常情况下,您提到的崩溃永远不会发生,因为在数组释放对象之前,对象不会被释放.在您的情况下,代码中的某个地方或者缺少保留,或者您发布的数量至少比需要的数量多一次.这导致可变数组中的对象在数组仍然引用该对象时被释放. (2认同)