NSUserDefaults removeObjectForKey e setObject: nil


116

Le due righe seguenti sono equivalenti?

1. [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]

2. [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]


1
Sì, tranne il primo che rende il tuo intento molto più chiaro.
Ballpoint

Risposte:


14

Swift 3.0

La risposta di seguito non è più il caso quando l'ho testato. Quando è impostato nilsul risultato, NSCFData viene archiviato. Forse un riferimento a un oggetto NSNull, ma non sono positivo.

Per rimuovere completamente un valore per una chiave utilizzare UserDefaults.standard.removeObject(forKey: "YourDefault")

Ho provato con il seguente codice:

UserDefaults.standard.set(["a", "b", "c"], forKey: "MyDefaults")
print("Test A: My saved defaults \(UserDefaults.standard.object(forKey: "MyDefaults"))")

UserDefaults.standard.set(nil, forKey: "MyDefaults")
print("Test B: My defaults set to nil \(UserDefaults.standard.object(forKey: "MyDefaults"))")

UserDefaults.standard.removeObject(forKey: "MyDefaults")
print("Test C: My defaults removed \(UserDefaults.standard.object(forKey: "MyDefaults"))")

Interessante, in Swift, quando digito set (nil, forKey: ...) e uso "jump to definition", mi porta al setter di URL. Il commento per quella funzione dice "-setURL: forKey è equivalente a -setObject: forKey: eccetto che il valore è archiviato in un NSData." Questo potrebbe spiegare perché si sta comportando male: poiché ci sono due funzioni sovraccaricate che accettano zero, Swift deve sceglierne una, ma setURL non si comporta allo stesso modo.
Richard Venable

96

Sì, entrambe le righe di codice sono equivalenti, entrambe risulteranno in lettura nulla

id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];

NSUserDefaultsrestituirà zero se la chiave non è stata trovata. Consiglierei di usare removeObjectForKeyinvece di impostarlo a zero.

ecco come verificare se l'impostazione del valore della chiave su nil ha rimosso la voce della chiave da NSUserDefaults standardUserDefaults.

NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
   for(NSString *key in keys) {
       NSLog(@"Key Name: %@", key);
}
[keys release];

o semplicemente scarica il dizionario chiave / valore di NSUserDefaults standardUserDefaults

NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

Sì, ma se lo imposti a zero, lo fa automaticamente removeObjectForKey?
ma11hew28

Non sono sicuro se impostarlo su "nil" rimuoverà la voce della chiave in [NSUserDefaults standardUserDefaults]. Un rapido test potrebbe essere quello di ottenere "allKeys" [[NSUserDefaults standardUserDefaults] allKeys] e iterare attraverso NSArrya dei nomi delle chiavi, scoprire se l'impostazione di una chiave su nil rimuove la chiave dall'array "allKey".
RocketMan

9
il risultato è "SÌ" sia "removeObjectForKey" che "setObject: nil" rimuoveranno la chiave @ "chiave di esempio" da [NSUserDefaults standardUserDefaults]
RocketMan

9
Grazie! Ho confermato anche questo. Giusto per chiarire, setObject:nilrimuoverà anche l'oggetto, non solo la sua chiave. Quindi, entrambe le funzioni producono esattamente lo stesso risultato. Inoltre, se rimuovi (o imposti a zero) l'unico oggetto (e chiave) memorizzato, l'intero file .plist viene eliminato.
ma11hew28

1

Swift 5.0 + iOS 11 e versioni successive

Entrambi i metodi rimuovono il valore. Ho provato questo in un parco giochi:

import Foundation

let key = "Test"
let value = "test"
let defaults = UserDefaults.standard

func printUD() {
    print("UserDefaults after modification:\n")
    defaults.dictionaryRepresentation().forEach { print("\($0): \($1)\n") }
    print("-------------\n\n")
}

defaults.set(value, forKey: key); printUD()
defaults.set(nil, forKey: key); printUD()
defaults.set(value, forKey: key); printUD()
defaults.removeObject(forKey: key); printUD()

Prima di iOS 11 questo si tradurrà in serializzazione nilin Datae genera un errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.