ios - 安全地执行对 NSMutableArray 的更改

标签 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

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

编辑:

我应该补充一点,所有这些都在 UICollectionViewcellForItemAtIndexPath 方法内运行。

最佳答案

首先,请您发布崩溃消息。很高兴知道您实际看到的错误是什么。


我想知道如果你切换到不可变数组会发生什么。将 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/

相关文章:

ios - Font Awesome Swift : "Ambiguous Use of Code"

ios - Objective-C 中的访问者模式

ios - 架构、业务对象、iOS 的干净实现

iphone - 导入指令不允许访问该类

objective-c - 在 iOS 中存储 "global"对象的位置

objective-c - 每次调用任何方法时调用宏 - Objective C

objective-c - 如何在 NSMutableArray 中存储两个字段?

ios - Swift 自定义 UITableViewController : switch statement case label section enum

ios - 具有 NSMutableArray 成员的自定义对象的 NSMutableArray 的深拷贝

swift - 如何在 swift 3 中使用 NSMutableArray 中的键删除 NSMutableDictionary