NSMutableArray删除对象,但然后应用程序崩溃
我有我认为是一个奇怪的错误,但我当然是相对较新的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
我不认为这做什么,你认为它。一行去一行:
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来执行此操作。
如何:
MyObject *objectToRemove = [objectArray objectAtIndex:10];
[objectToRemove removeFromSuperview];
[objectArray removeObjectAtIndex:10];
removeFromSuperview将再次递减保留计数上objectToRemove。 (removeFromSuperview意味着它被添加到以前的视图,并保留它并将其保留计数递增1)。 removeObjectAtIndex将再次递减。但按照这个顺序,当你仍然需要时,你很可能不会释放它。 (当然,添加到数组中也保留它,所以顺序可能不那么重要)。