首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios阵列崩溃多线程问题,线程安全

ios阵列崩溃多线程问题,线程安全
EN

Stack Overflow用户
提问于 2015-02-21 02:34:35
回答 2查看 228关注 0票数 1

我正在分析一份崩溃报告,发现了一个异常,可能是由于竞态条件(我最好的猜测)。

崩溃日志:

代码语言:javascript
复制
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数组使用基于位置的请求进行更新,这些请求也定期在其他地方出现。

代码语言:javascript
复制
NSArray *batchesCopy = [self.batches copy];

我的问题是,防止这些竞争条件的最佳方法是什么?有没有一种线程安全的方法来进行数组复制或数组编辑?例如互斥锁,或者在属性上使用"atomic“选项?

EN

回答 2

Stack Overflow用户

发布于 2015-02-21 02:40:02

有语言级别的锁定:

代码语言:javascript
复制
@synchronized(self){
    //array operations
}
票数 1
EN

Stack Overflow用户

发布于 2015-02-21 05:50:10

一种方法是无锁方法,在这种方法中,您有一个指定的线程,该线程是唯一读取或更改对象值的线程。您可以使用现有的串行线程(最常见的是主线程,因为它已经存在,并且有许多简单的方法可以在它上面运行代码),或者只为该对象或对象类保留一个自定义的串行线程。其风格是,每当您需要与该对象进行交互时,您都会在指定的线程上调度一个块,该线程读取或写入数据,并根据新值执行生成的工作。这种方式避免了死锁和自旋锁,而且可以更快,但它可以有更多的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28635869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档