7

我知道文档说是这样,而且我知道这个主题已经在讨论中,但是我有一个有趣的堆栈结果,我无法得出任何结论,但这[NSUserDefaults standardUserDefaults]不是线程安全的。所以我会发布我的崩溃日志并希望有人看到我看不到的东西......

崩溃的线程

    ... 
    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:-> 崩溃线程...

    - (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"];
    ...
    }

我在其他几种情况下发生了这种崩溃,它总是包括在一个线程中写入用户默认值并在其他崩溃的线程中同步..如果有人有其他解释,我会非常满意......

4

2 回答 2

3

NSUserDefaults 类是线程安全的。

(c) https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/index.html

于 2015-04-10T22:11:59.493 回答
-8

nsuserdefaults 不是线程安全的。请检查苹果文档,如果它没有讨论任何 ios 术语的线程安全,那么它不是线程安全的......

于 2013-12-25T17:31:25.043 回答