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

BDu*_*ook 0 iphone nsmutablearray

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

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

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

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

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

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

您可以提供任何帮助,我们将不胜感激,

BWC

pet*_*erb 6

我认为这不符合您的想法.逐行:

MyObject *objectToRemove = [[MyObject alloc] init];
Run Code Online (Sandbox Code Playgroud)

您分配一个类型为"MyObject"的新对象.

objectToRemove = [objectArray objectAtIndex:10];
Run Code Online (Sandbox Code Playgroud)

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

 [objectArray removeObjectAtIndex:10];
Run Code Online (Sandbox Code Playgroud)

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

 [objectToRemove removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)

现在,您正在向之前在objectArray中的对象发送消息.如果对象被前一行代码解除分配,我会发现崩溃.

抛开声明中的泄漏,您可以这样做:

        objectToRemove = [[objectArray objectAtIndex:10] retain];
        [objectArray removeObjectAtIndex:10];
        [objectToRemove removeFromSuperview];
        [objectToRemove release];
Run Code Online (Sandbox Code Playgroud)

这样可以防止对象从你身下解除分配,如果这就是崩溃发生的原因.

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