2013-10-21 9 views
7

Ich weiß, dass die Dokumentation sagt, dass es ist, und ich weiß, dass dieses Thema bereits diskutiert wurde, aber ich habe ein interessantes Stack-Ergebnis, und ich kann nichts anderes als dass [NSUserDefaults standardUserDefaults] nicht threadsafe schließen. Also werde ich meine Crashlog posten und hoffen, dass jemand sieht etwas, was ich kann nicht ...Ist NSUserDefaults threadsafe

Crashed Thema

... 
    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 

einige andere Thread

... 
    CoreFoundation 0x302bc13f _CFXPreferencesSetValue + 107 
    CoreFoundation 0x302bc039 CFPreferencesSetAppValue + 41 
    Foundation 0x30c76935 -[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 61 
    MyApp 0x000b2e9d -[AppData parserDidEndDocument:] (AppData.m:1013) 
    ... 

Teile des Stapels gewesen ausgeschnitten und durch "..." ersetzt, weil es einfach zu lang und für das Thema irrelevant ist. App stürzt ab mit der Meldung:

* Sammlung < __NSDictionaryM: 0x15a04ae0> wurde mutiert, während aufgezählt werden. ....

Code: AppDelegate: -> crached Thread ...

- (void)applicationDidEnterBackground:(UIApplication *)application 
    { 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 

MyClass: -> zweites Gewinde:

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

Ich habe diesen Absturz in Paar in anderen Fällen enthält es immer etwas Schreiben auf Benutzerstandards in einem Thread und das Synchronisieren in anderem Thread, der abstürzt. Wenn jemand eine andere Erklärung hat, wäre ich sehr großartig ...

+0

Nun, wenn die „mutierte, während aufgezählt wird“ Fehler im Code Benutzervorgabe waren dann würde ich sagen, dass es nicht Thread-sicher ist. – trojanfoe

+2

Sie müssen nach jeder Änderung auf 'NSUserDefaults'' syn- chronisieren' und aus Ihrem Code den zweiten Thread nicht aufrufen. – danypata

+1

@danypata Warum musst du das tun? – trojanfoe

Antwort

-7

nsuserdefaults nicht threadsicher. Bitte überprüfen Sie Apple Dokumentation, wenn es nicht über Thread-Safe für alle Ios Begriffe diskutieren, dann ist es nicht Thread sicher ....

+1

Laut dem Kommentar zu der anderen Antwort, die Dokumentation sagt das genaue Gegenteil von dem, was Sie behaupten. Siehe https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.html und lies den letzten Satz der Übersicht. – Tommy

+0

Er antwortete auf Weihnachten. Schneiden Sie ihn für seine schlechte Laune durch. – Jameson