Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 防止写入对象时枚举对象时崩溃_Objective C_Multithreading_Thread Safety_Locking - Fatal编程技术网

Objective c 防止写入对象时枚举对象时崩溃

Objective c 防止写入对象时枚举对象时崩溃,objective-c,multithreading,thread-safety,locking,Objective C,Multithreading,Thread Safety,Locking,我有一个使用可变字典的多线程应用程序。这本词典一秒钟要写好几遍。每次写入时,也会在之后直接枚举。更新后的词典在更新后直接连接到Quartz Composer乐曲上已发布的输入。当更新非常频繁时,当我们试图在写入对象的同时枚举对象时,我会看到崩溃 if( self.dictEvent && [ [ self.renderer inputKeys ] containsObject: @"Event" ] ) { @synchronized( self.dictEvent )

我有一个使用可变字典的多线程应用程序。这本词典一秒钟要写好几遍。每次写入时,也会在之后直接枚举。更新后的词典在更新后直接连接到Quartz Composer乐曲上已发布的输入。当更新非常频繁时,当我们试图在写入对象的同时枚举对象时,我会看到崩溃

if( self.dictEvent && [ [ self.renderer inputKeys ] containsObject: @"Event" ] )
{
    @synchronized( self.dictEvent )
    {
        [ self.renderer setValue: self.dictEvent forInputKey: @"Event" ];               
    }
}
它崩溃于:

[ self.renderer setValue: self.dictEvent forInputKey: @"Event" ];               
我知道这一行在将字典传递给QC组合时枚举并序列化字典

我尝试在写入字典和枚举它的位置上使用@synchronized。这并不成功。我不清楚@synchronized是否只保护线程不运行同一代码块,或者它是否可以阻止线程运行同一对象上同步的任何代码块

如果我将有问题的行替换为:NSLog@Event:%@,self.dictEvent;我得到以下信息:

2014-11-01 10:48:02.679 Flocaster[24583:8446817]*由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“*集合在枚举时发生了变异。”

非常感谢您提供的任何提示

谢谢!
Adam

self.renderer是正在枚举的字典。正当但同步时,使用@synchronizedself.dictEvents。您没有在self.renderer.Show上提供任何互斥。显示正在执行迭代的代码。为什么你说它在调用setValue:forInputKey时崩溃了?可能是迭代崩溃了?枚举的不是我的代码。当字典附加到已发布的输入时,它会自动发生。它们被序列化,然后传输到QC。我也可以NSLog@Event:%@,self.dictEvent,它也将在那里崩溃。上面添加了更多详细信息。@mohanada.Hassan我认为列举的是dictEvent,但您可能是对的。如果是这种情况,它不能解释为什么我用just self.dictEvent的NSLog替换setValue时它会崩溃。这怎么可能?@mohanada.Hassan我很确定,并不是渲染器被枚举和崩溃。即使我没有设置渲染器的值,也会收到日志消息。我想一定是dictEvent字典崩溃了,因为它在NSLog条目上崩溃,而NSLog条目是我记录的唯一值。