【发布时间】:2012-08-12 07:51:36
【问题描述】:
如果我有两个不同的线程通过 GCD 访问 NSMutableArray 并且一个只是基于可变数组创建一个新数组,而另一个线程正在从数组中删除记录,我应该认为这是一个问题吗?也就是说,我认为只是“读取”数组的副本不应该只是得到当时数组中发生的任何事情吗?我没有在任一线程中枚举数组,但它仍然崩溃。一旦我删除读取例程,它就可以正常工作。
这里是“阅读”:
dispatch_async(saveQueue, ^{
NSDictionary*tempstocks=[NSDictionary dictionaryWithDictionary:self.data];
它在此线程上崩溃:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[9]'
这是另一个线程上发生的事情:
[self.data removeObjectForKey:item];
我知道你不能在枚举时进行变异,但我认为在变异时阅读是可以的,你可能不知道你得到的是哪个版本的变异对象,但我认为这不是问题,但是显然是的。也许dictionaryWithDictionary 方法正在执行一个首先看到 X 对象的操作,但在例程完成时它包含 X-Y 对象,因此它不会在运行 dictionaryWithDictionary 时立即“捕获”整个 self.data 字典而是枚举self.data,这与枚举时的突变本质上是相同的问题?
【问题讨论】:
-
有你的代码吗?我想看看代码。
-
崩溃时收到的错误信息是什么?
-
用代码和错误详情更新问题
标签: cocoa concurrency grand-central-dispatch