2013-10-21 51 views
7

我知道文档说它是,我知道这个问题已经在讨论中,但我有一个有趣的堆栈结果,我不能断定别的事情,但[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"]; 
    ... 
    } 

我有这样的崩溃情侣在其他情况下,它总是包含一些在一个线程中写入用户默认值并在其他线程中同步的崩溃。如果任何人有其他解释,我会非常好...

+0

那么,如果说“突变而被枚举”错误是在用户违约代码,然后我会说,这不是线程安全的。 – trojanfoe

+2

您必须在每次更改'NSUserDefaults'和代码后调用'synchronise',第二个线程不会调用它。 – danypata

+1

@danypata你为什么要这样做? – trojanfoe

回答

-7

nsuserdefaults in not thread safe。请检查苹果文档,如果它没有讨论任何ios条款的线程安全,那么它是不是线程安全的....

+1

根据其他答案的评论,文件说明了与你声称的完全相反。请参阅https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.html并阅读概述的最后一句。 – Tommy

+0

他在圣诞节回答了这个问题。为他的不好心情削减他一些懈怠。 – Jameson