【问题标题】:NSMutableArray strange crash - removeObjectAtIndexNSMutableArray 奇怪的崩溃 - removeObjectAtIndex
【发布时间】:2017-07-13 05:59:10
【问题描述】:

我的一个应用程序崩溃了,以下日志看起来很奇怪:

* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM removeObjectAtIndex:]:索引 4294967293 越界 [0 .. 4294967293]'

根据堆栈跟踪,这来自以下代码:

if ([self.itemList count] > 0) {
    [self.itemList removeAllObjects];
}

根据我的理解,removeAllObjects 始终是一个安全的操作,不应该以这样的崩溃告终。我在这里错过了什么吗?任何正确方向的指导都会非常有帮助。

编辑:

这是我声明的itemList 属性:

@property (nonatomic, strong) NSMutableArray *itemList;

【问题讨论】:

  • 以及如何分配该数组?
  • 试试这个条件:if([self.itemList isKindOfClass:[NSMutableArray class]]){//remove object here}
  • 你确定崩溃是由这些代码行引起的吗?你有其他代码调用removeObjectAtIndex吗?你的代码是多线程的吗?
  • 那么您可能正在对self.itemList 进行其他更改,同时对removeAllObjects 的调用正在运行。您需要确保没有两个线程可以同时读取/写入数组。
  • 实际上,使itemList 原子化并不能使可变数组线程安全。如果 itemList 在不同的线程上发生突变,则使属性原子化将无济于事。您需要使用队列、锁或同步以线程安全的方式访问itemList

标签: objective-c cocoa-touch nsmutablearray


【解决方案1】:

这很可能是由非原子属性引起的。正如您提到的,此代码是多线程的,并且您使用的属性不是线程安全的。

  • 由于未捕获的异常 'NSRangeException' 导致应用程序终止,原因:'* -[__NSArrayM removeObjectAtIndex:]: index 4294967293 beyond bounds [0 .. 4294967293]'

此错误仅表示必须删除的对象已被删除,因此返回的索引为“4294967293”。尝试将数组设置为原子。还可以尝试使用@synchronized,如此处类似问题中所述:

NSMutableArray removeAllObjects beyond bounds exception

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多