安全地对NSMutableArray执行更改

时间:2016-09-15 20:52:16

标签: ios objective-c nsmutablearray

什么会导致NSMutableArray的分配或更改崩溃? 我有一个包含自定义对象的可变数组,我一直保持不超过其中的3个最新对象,其余的被删除。我开始打电话了

[myArray insertObject:newObject atIndex:0];

if (myArray.count > 3)
    [myArray removeLastObject]; // Crash

但是每当我执行此操作太快时,最后一行会导致无异常崩溃。 我知道在枚举数组时不允许添加或删除数组的对象,但我不会在任何地方枚举myArray,除非在其上调用count执行隐式枚举。我也尝试过这样做:

NSMutableArray *tmp = [myArray mutableCopy];
[tmp removeLastObject];
myArray = tmp; // Crash

但同样的事情发生了,它在最后一行崩溃了。再次,这在慢慢地完成时非常好。当用户点击按钮时,动作本身就被调用,当点击它太快时,它每次都会崩溃。

修改

我应该补充说,所有这些都是在cellForItemAtIndexPath的{​​{1}}方法中运行。

3 个答案:

答案 0 :(得分:1)

首先,您能否发布崩溃消息。知道你实际看到的错误会很高兴。

我想知道如果切换到不可变数组会发生什么。将table = getArrayValues(table); int newcounter = matchCriteria(table, counter, n); 切换为for (int i = 0; i < table.length; i++){ System.out.println("Enter an array value: "); table[i] = input.nextInt(); while(table[i] < 0) { System.out.println("Pleas try a nonnegative number!" ); table[i] = input.nextInt(); } } 并使用以下内容。

myArray

NSArray *

的位置
myArray = [self updatedArray:myArray withObject:newObject];

或者更好的测试

-updatedArray:withObject:

如果代码在我的评论中崩溃,那么解除分配- (NSArray *)updatedArray:(NSArray *)array withObject:(id)object { switch (array.count) { case 0: return @[object]; case 1: return @[object, array[0]]; default: return @[object, array[0], array[1]]; } } 会导致崩溃。我的猜测是数组中的一个项目指向坏内存(一个僵尸或一些这样的东西)。

答案 1 :(得分:0)

我可以想到崩溃的两个可能原因:

1)正在从多个线程访问/变异数组 2)数组中的一个对象在某处被过度释放,导致它在仍然存在于数组内时被释放。

简短回答:尝试在乐器中分析您的应用,并选择&#34; Zombies&#34;仪器。当崩溃发生时,您可能会收到一个僵尸警报,在这种情况下,您可以获得导致内存被踩踏的所有内容的回溯日志。

答案 2 :(得分:0)

我认为根本原因是这个变量可以同时从多个线程访问。

访问数组时可以使用它

@synchronized(self) {
    //Your accessed code here
}