NSMutableArray删除对象但随后应用程序崩溃

时间:2009-08-19 01:14:57

标签: iphone nsmutablearray

我认为这是一个奇怪的错误但当然我对iPhone开发相对较新,所以它可能毕竟不是那么奇怪。

我有一个我正在跟踪的对象数组(NSMutableArray)(每次用户触摸按钮时都会添加一个对象)我正在尝试做的是当数组达到我添加的某个值时新对象到数组的开头,然后删除数组中的最后一个对象。当我单步执行我的代码时,一切正常,对象被删除但是应用程序崩溃了......当应用程序崩溃并且应用程序中没有循环或计时器时,调试器不在任何代码行上,所以我可以'想到其他任何正在运行的东西。

这是在崩溃之前执行的代码

if([objectArray count] > 10)
{
    MyObject *objectToRemove = [[MyObject alloc] init];
    objectToRemove = [objectArray objectAtIndex:10];
    [objectArray removeObjectAtIndex:10];
    [objectToRemove removeFromSuperview];
}

此代码的要点是,每次用户触摸按钮时,对象都会添加到屏幕并显示,然后当对象数量达到10并且用户再次触摸按钮时,添加的第一个对象是删除并显示新对象。如果我注释掉removeObjectAtIndex行,一切都按预期工作,但数组继续增长。

我还尝试在删除UIview后删除对象,并且应用程序的行为方式相同。如果我尝试从不同索引(I.E 3)的数组中删除一个对象,应用程序不会崩溃,但它不会给我我预期的结果。但就像我说代码运行正常,当我在执行行之前和之后检查数组的计数时,值分别为11和10。

您可以提供任何帮助,

BWC

2 个答案:

答案 0 :(得分:6)

我认为这不符合你的想法。逐行:

MyObject *objectToRemove = [[MyObject alloc] init];

您分配一个“MyObject。

类型的新对象
objectToRemove = [objectArray objectAtIndex:10];

使用objectArray中索引10处的内容覆盖本地MyObject指针。您最初分配的objectToRemove现在已泄露。

 [objectArray removeObjectAtIndex:10];

现在您已经删除了索引10处的对象。当您从数组中删除它时,它将被释放并且其引用计数会减少。这可能(或可能不)导致它被解除分配。

 [objectToRemove removeFromSuperview];

现在您正在向之前在objectArray中的对象发送消息。如果对象被前一行代码释放,我预计会崩溃。

暂不说明声明中的泄漏,您可以这样做:

        objectToRemove = [[objectArray objectAtIndex:10] retain];
        [objectArray removeObjectAtIndex:10];
        [objectToRemove removeFromSuperview];
        [objectToRemove release];

这会阻止对象从你身下解除分配,如果这就是发生崩溃的原因。

确定我的方案是否正在发生的一种方法是打开NSZombies,您可以通过将环境变量NSZombieEnabled设置为YES来执行此操作。

答案 1 :(得分:1)

怎么样:

MyObject *objectToRemove = [objectArray objectAtIndex:10];
[objectToRemove removeFromSuperview];
[objectArray removeObjectAtIndex:10];

removeFromSuperview将在objectToRemove上减少一次保留计数。 (removeFromSuperview意味着它先前已添加到视图中并保留了它并将其保留计数增加1)。 removeObjectAtIndex将再次递减它。但是按照这个顺序,当你仍然需要它时,你很可能不会释放它。 (当然,添加到数组也保留了它,因此顺序可能不那么重要。)