我有一个使用可变字典的多线程应用程序。字典每秒写入多次。每次写入时,也会在之后直接枚举。更新的字典在更新后直接连接到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
,它被枚举。这没有成功。我不清楚@sychronized
是否仅保护线程不运行相同的代码块,或者它是否可以阻止线程运行任何代码块同步相同的对象。
如果我用以下内容替换违规行:NSLog(@“Event:%@”,self.dictEvent);我收到以下消息:
2014-11-01 10:48:02.679 Flocaster [24583:8446817] *由于未捕获的异常'NSGenericException'而终止应用程序,原因:'* 集合< __ NSCFDictionary:0x618000e6ed00>在被列举时被突变。'
您可以提供的任何提示区域都非常感谢!
谢谢! 亚当