iPhone - 可变数组无法存储空对象

3
我有一个可变数组,里面存储了多个对象并且被保留。在某些时候,其中的一个对象可能会变成 nil。当这种情况发生时,应用程序将会崩溃,因为数组不能包含 nil 对象。例如:

[object1, object2, object3, nil];

然后,object2 = nil;

[object1, nil, object3, nil];

实际上,这是不可能的,因为 nil 是数组的结束标记。那么,如何解决这个问题呢?感谢各位的帮助。

1个回答

9

如果您必须存储一个空占位符对象,请使用[NSNull null]

例如:

NSArray * myArray = [NSArray arrayWithObjects:obj1, [NSNull null], obj3, nil];

myArray将包含3个对象。当您检索对象时,可以进行简单的指针相等性测试,以查看它是否为Null单例:

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

编辑(回复评论)

@Mike,我认为你对实际情况有些混淆。

如果您有:

id obj = ...;

那么obj包含一个地址,而不是对象。因此,如果您执行NSLog(@"%p", obj),它将打印类似于0x1234567890的内容。当您将obj放入数组中时,它并没有复制对象,而是复制了对象的地址。因此,该数组实际上包含0x1234567890。因此,当您稍后执行:obj = nil;时,您只影响了数组之外的指针。该数组仍将包含0x1234567890


谢谢,但问题是这样的。我没有存储一个 nil。当数组被创建时,对象不是 nil,但之后它变成了 nil。因此,读取数组将导致崩溃。那么,你的意思是什么?能详细说明一下吗? - Duck
2
在这种情况下,您有一个错误。数组中的对象由数组保留。在正常情况下,您提到的崩溃永远不应该发生,因为直到数组释放对象之前,对象都不会被释放。在您的情况下,您的代码中某个地方缺少保留,或者释放次数超过所需。这会导致可变数组中的对象在数组仍然引用对象时被释放。 - Giao
我认为你可能是正确的...那么请告诉我:假设我创建并初始化了2个视图,viewA和viewB。如果我执行以下操作,我将拥有什么样的数组:[viewA,viewB,nil] ::::: [(id)[viewA,(id)viewB,nil]?我认为我将分别拥有对象本身和对对象的引用,对吗?或者在这两种情况下都只有引用? - Duck
@Mike 在这两种情况下都是引用。所有对象都独立地存在于堆上,无论它们在何处被引用。 - Dave DeLong

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