什么会导致对 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
但是同样的事情发生了,它在最后一行崩溃了。再说一次,当慢慢地做时,这个效果非常好。当用户点击按钮时,操作本身就会被调用,如果点击太快,它每次都会崩溃。
编辑:
我应该补充一点,所有这些都在 UICollectionView
的 cellForItemAtIndexPath
方法内运行。
最佳答案
首先,请您发布崩溃消息。很高兴知道您实际看到的错误是什么。
我想知道如果你切换到不可变数组会发生什么。将 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]];
}
}
或更适合测试
NSArray *temp = [self updatedArray:myArray withObject:newObject];
myArray = temp; // I assume the crash will be here!
如果代码在我的评论处崩溃,那么释放 myArray
就是导致崩溃的原因。我的猜测是数组中的一项指向错误的内存(僵尸或类似的东西)。
关于ios - 安全地执行对 NSMutableArray 的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39520172/