2013-10-21 6 views
7

So che la documentazione dice che lo è, e so che questo argomento era già in discussione ma ho un risultato di stack interessante e non posso concludere nient'altro che lo [NSUserDefaults standardUserDefaults] non è thread-safe. Così Io posto il mio crash log e la speranza che qualcuno vede qualcosa che non posso ...È NSUserDefaults threadsafe

Crashed Discussione

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

qualche altro thread

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

parti dello stack sono stati tagliato e sostituito con "..." perché è troppo lungo e irrilevante per il soggetto. App si blocca con il messaggio:

* Collezione < __NSDictionaryM: 0x15a04ae0> è stato mutato mentre viene enumerato. ....

Codice: AppDelegate: -> filo crached ...

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

MyClass: -> secondo thread:

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

ho questo incidente nelle coppie di altri casi, include sempre la scrittura su valori predefiniti dell'utente in un thread e la sincronizzazione in altro thread che si blocca. Se qualcuno ha qualche altra spiegazione sarei molto grato ...

+0

Beh, se questo errore "pur essendo enumerato mutato" è stato nel codice predefinite dall'utente allora direi che non è thread-safe. – trojanfoe

+2

Devi chiamare 'synchronise' dopo ogni modifica su' NSUserDefaults' e dal tuo codice, il secondo thread non lo chiama. – danypata

+1

@danypata Perché devi farlo? – trojanfoe

risposta

-7

nsuserdefaults in non thread-safe. Si prega di controllare la documentazione Apple se non si parla di thread safe per tutti i termini ios, quindi non è thread-safe ....

+1

Come per il commento sull'altra risposta, la documentazione dice esattamente l'opposto di ciò che rivendichi. Vedere https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.html e leggere la frase finale della Panoramica. – Tommy

+0

Ha risposto a Natale. Riducetelo un po 'per il suo cattivo umore. – Jameson