Czy poniższe dwa wiersze są równoważne?
1.
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]
2.
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]
Czy poniższe dwa wiersze są równoważne?
1.
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]
2.
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]
Odpowiedzi:
Swift 3.0
Poniższa odpowiedź nie ma już miejsca, kiedy to testowałem. Gdy ustawiony nil
na wynik, jest przechowywany NSCFData. Prawdopodobnie odwołanie do obiektu NSNull, ale nie mam pewności.
Aby całkowicie usunąć wartość klucza, użyj UserDefaults.standard.removeObject(forKey: "YourDefault")
Testowałem z następującym kodem:
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"))")
Tak, oba wiersze kodu są równoważne, oba spowodują zerowy odczyt
id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];
NSUserDefaults
zwróci nil, jeśli klucz nie został znaleziony. Zalecałbym użycie removeObjectForKey
zamiast ustawiania go na zero.
oto jak sprawdzić, czy ustawienie wartości klucza na zero spowodowało usunięcie wpisu klucza z NSUserDefaults standardUserDefaults
.
NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
for(NSString *key in keys) {
NSLog(@"Key Name: %@", key);
}
[keys release];
lub po prostu zrzuć słownik kluczy / wartości NSUserDefaults standardUserDefaults
NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
removeObjectForKey
?
setObject:nil
usunie również przedmiot, a nie tylko jego klucz. Zatem obie funkcje powodują dokładnie ten sam wynik. Ponadto, jeśli usuniesz (lub ustawisz na zero) jedyny przechowywany obiekt (i klucz), cały plik .plist zostanie usunięty.
Swift 5.0 + iOS 11 i nowsze
Obie metody usuwają wartość. Próbowałem tego na placu zabaw:
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()
W wersjach starszych niż iOS 11 spowoduje to serializację nil
do Data
i zgłoszenie błędu.