【发布时间】: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