Czy poniższe dwa wiersze są równoważne?
1.
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]
2.
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]
nsuserdefaults
ma11hew28
źródło
źródło
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:
źródło
Tak, oba wiersze kodu są równoważne, oba spowodują zerowy odczyt
NSUserDefaults
zwróci nil, jeśli klucz nie został znaleziony. Zalecałbym użycieremoveObjectForKey
zamiast ustawiania go na zero.oto jak sprawdzić, czy ustawienie wartości klucza na zero spowodowało usunięcie wpisu klucza z
NSUserDefaults standardUserDefaults
.lub po prostu zrzuć słownik kluczy / wartości
NSUserDefaults standardUserDefaults
źródło
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:
W wersjach starszych niż iOS 11 spowoduje to serializację
nil
doData
i zgłoszenie błędu.źródło