0

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

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

这是崩溃前执行的代码

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

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

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

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

生物武器公约

4

2 回答 2

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 来实现。

于 2009-08-19T01:22:55.973 回答
1

怎么样:

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

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

于 2009-08-19T07:28:08.727 回答