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 ...
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
Sie müssen nach jeder Änderung auf 'NSUserDefaults'' syn- chronisieren' und aus Ihrem Code den zweiten Thread nicht aufrufen. – danypata
@danypata Warum musst du das tun? – trojanfoe