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: -> 2 番目のスレッド:

    -(void)parserDidEndDocument:(NSXMLParser *)parser {
    ...
        [[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"savedStations"];
        [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"lastUpdateDate"];
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"alreadyLoaded"];
    ...
    }

私は他のいくつかのケースでこのクラッシュを経験しています.1つのスレッドでユーザーのデフォルトへの書き込みと、クラッシュする他のスレッドでの同期が常に含まれています..

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 に答える