我正在分析一份崩溃报告,发现了一个异常,可能是由于竞态条件(我最好的猜测)。
崩溃日志:
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值,我猜测这是一个可能的竞争条件,因为此行在重复计时器上运行,并且batches数组使用基于位置的请求进行更新,这些请求也定期在其他地方出现。
NSArray *batchesCopy = [self.batches copy];我的问题是,防止这些竞争条件的最佳方法是什么?有没有一种线程安全的方法来进行数组复制或数组编辑?例如互斥锁,或者在属性上使用"atomic“选项?
发布于 2015-02-21 02:40:02
有语言级别的锁定:
@synchronized(self){
//array operations
}发布于 2015-02-21 05:50:10
一种方法是无锁方法,在这种方法中,您有一个指定的线程,该线程是唯一读取或更改对象值的线程。您可以使用现有的串行线程(最常见的是主线程,因为它已经存在,并且有许多简单的方法可以在它上面运行代码),或者只为该对象或对象类保留一个自定义的串行线程。其风格是,每当您需要与该对象进行交互时,您都会在指定的线程上调度一个块,该线程读取或写入数据,并根据新值执行生成的工作。这种方式避免了死锁和自旋锁,而且可以更快,但它可以有更多的代码。
https://stackoverflow.com/questions/28635869
复制相似问题