2009-08-19 83 views
0

我有我认为是一个奇怪的错误,但我当然是相对较新的iPhone开发,所以它可能不是所有这些奇怪毕竟。NSMutableArray删除对象,但然后应用程序崩溃

我有一个数组(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

回答

6

我不认为这做什么,你认为它。一行去一行:

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

你分配类型MyObject来的”新对象

objectToRemove = [objectArray objectAtIndex:10]; 

你有什么是在objectArray指数10覆盖本地的MyObject指针您最初分配objectToRemove。现在泄露。

[objectArray removeObjectAtIndex:10]; 

现在你已经在指数10.删除的对象。当你从数组中删除它,它被释放,它的引用计数减:T他的可能(或不可能)导致它被释放。

[objectToRemove removeFromSuperview]; 

现在,您要发送消息给以前在objectArray中的对象。如果该对象被前面的代码行解除分配,我会期待崩溃。

在声明中撇开泄漏,您可能能够做到这一点:

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

这可以防止物体从你下被释放出来,如果这就是为什么崩溃正在发生的事情。

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

1

如何:

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

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

相关问题