我正在分析崩溃报告,并且遇到了可能由竞争条件引起的异常(我的最佳猜测)。
崩溃日志:
Fatal Exception: NSInvalidArgumentException
*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[9]
0 CoreFoundation
__exceptionPreprocess + 132
2 CoreFoundation
-[__NSPlaceholderArray initWithObjects:count:] + 412
3 CoreFoundation
-[NSArray initWithArray:range:copyItems:] + 464
最可能的罪魁祸首就是我的代码。由于数组永远不应该包含nil值,我的猜测是一个可能的竞争条件,因为这一行在重复计时器上运行,并且批处理数组更新时基于位置的请求也会定期在其他地方进行。
NSArray *batchesCopy = [self.batches copy];
我的问题是,防止这些竞争条件的最佳方法是什么?是否有一种线程安全的方法来进行数组复制或数组编辑?例如,互斥锁或者可以使用" atomic"物业选项?
答案 0 :(得分:1)
语言级锁定:
@synchronized(self){
//array operations
}
答案 1 :(得分:0)
一种方法是无锁方法,在这种方法中,您有一个指定的线程,它是唯一一个读取或更改该对象值的线程。您可以使用现有的串行线程(最常见的是主线程,因为它已经存在,并且有许多简单的方法可以在其上运行代码)或者只为该对象或对象类保留自定义串行线程。风格是,无论何时您需要与该事物进行交互,您都会在指定的线程上调度一个块来读取或写入数据,并根据新值执行生成的工作。这样可以避免死锁和自旋锁,并且可以更快,但可以使用更多代码。