2010-04-07 42 views
3

我有一个可变的数组,保留并存储几个对象。在某个时候,一个对象可能会变成零。发生这种情况时,应用程序将崩溃,因为数组不能有零对象。想象一下像iphone - mutablearray不能存储零对象

[object1,object2,object3,nil];

然后,Object2的=零

[object1,零,object3,零]。

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

回答

9

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

例如:

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

myArray将包含3个对象。当您检索对象,你可以做一个简单的指针平等的测试,看看它的空单:

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

+0

谢谢,但重点是这个。我不存储零。当数组被创建时,对象不是零,但是在那之后,它变成了零。所以,读取数组将导致崩溃。所以你是什么意思?你能详细说明吗? – SpaceDog 2010-04-07 16:31:03

+2

在这种情况下,你有一个错误。数组中的对象由数组保留。在正常情况下,您提到的崩溃不应该发生,因为在数组释放对象之前,对象不会被释放。在你的情况下,在你的代码中有一个失踪的保留,或者你至少释放一次。这导致可变数组中的对象被释放,而数组仍然引用该对象。 – Giao 2010-04-07 16:33:56

+0

@Mike编辑答案。 – 2010-04-07 16:36:35