我知道文档说它是,我知道这个问题已经在讨论中,但我有一个有趣的堆栈结果,我不能断定别的事情,但[NSUserDefaults standardUserDefaults]
不是线程安全的。所以我会后我崩溃日志,并希望有人看到的东西,我不能......是NSUserDefaults线程安全
坠毁主题
...
libdispatch.dylib 0x3ab53d67 _dispatch_client_callout + 23
libdispatch.dylib 0x3ab65e73 _dispatch_barrier_sync_f_invoke + 27
CoreFoundation 0x302b470d CFPreferencesAppSynchronize + 265
Foundation 0x30151b01 -[NSUserDefaults(NSUserDefaults) synchronize] + 25
MyApp 0x0009df8b -[AppDelegate applicationDidEnterBackground:] (AppDelegate.m:178)
...
MyApp 0x0005344b main (main.m:17)
MyApp 0x000533f8 start + 40
一些其他线程的堆栈的
...
CoreFoundation 0x302bc13f _CFXPreferencesSetValue + 107
CoreFoundation 0x302bc039 CFPreferencesSetAppValue + 41
Foundation 0x30c76935 -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 61
MyApp 0x000b2e9d -[AppData parserDidEndDocument:] (AppData.m:1013)
...
部分已被删去并用“...”代替,导致它太长而且与主题无关。应用程序崩溃与消息:
*收藏< __NSDictionaryM:0x15a04ae0>同时列举了突变。 ....
代码: 的AppDelegate: - > crached线程...
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults] synchronize];
}
MyClass的: - >第二个线程:
-(void)parserDidEndDocument:(NSXMLParser *)parser {
...
[[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"savedStations"];
[[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"lastUpdateDate"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"alreadyLoaded"];
...
}
我有这样的崩溃情侣在其他情况下,它总是包含一些在一个线程中写入用户默认值并在其他线程中同步的崩溃。如果任何人有其他解释,我会非常好...
那么,如果说“突变而被枚举”错误是在用户违约代码,然后我会说,这不是线程安全的。 – trojanfoe
您必须在每次更改'NSUserDefaults'和代码后调用'synchronise',第二个线程不会调用它。 – danypata
@danypata你为什么要这样做? – trojanfoe