2013-10-21 8 views
7

ドキュメンテーションにはそれがあると言われていますが、この問題はすでに議論中ですが、興味深いスタック結果があり、何も終わらないと思いますが、[NSUserDefaults standardUserDefaults]はスレッドセーフではありません。だから私は私のクラッシュログを投稿して誰かがその私ができない何かを見ていることを願っています...NSUserDefaults threadsafe

は、Thread

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

私は夫婦でこのクラッシュを持っています他の場合は、常に1つのスレッドにユーザーのデフォルトへの書き込みと、クラッシュする他のスレッドでの同期化が含まれています。誰かが他の説明をしていると、私は非常に素晴らしいものになります...

+0

まあ、それはエラー「列挙された状態で変異した」場合、私はそれがスレッドセーフでないことを言うだろう、ユーザーのデフォルトのコードにありました。 – trojanfoe

+2

あなたは 'NSUserDefaults'のすべての変更の後に' synchronise'を呼び出す必要があり、コードから2番目のスレッドは呼び出していません。 – danypata

+1

@danypataなぜあなたはそれをしなければなりませんか? – trojanfoe

答えて

-7

nsuserdefaultsはスレッドセーフではありません。スレッドセーフであれば、スレッドセーフであるかどうかについては、アップルのドキュメントを確認してください。

+1

他の回答のコメントによると、文書には、あなたが主張しているものとまったく反対のものが記載されています。 https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.htmlを参照し、概要の最終文を読んでください。 – Tommy

+0

彼はクリスマスにそれに答えました。彼の悪い気分のためにいくつかの余裕をカット。 – Jameson