Відповіді:
Swift 3.0
Наведена нижче відповідь більше не стосується, коли я це перевіряв. Якщо встановлено nil
результат, NSCFData зберігається. Можливо, посилання на об’єкт NSNull, але я не позитивний.
Повністю видалити значення для ключового використання UserDefaults.standard.removeObject(forKey: "YourDefault")
Я перевірив наступний код:
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"))")
Так, обидва рядки коду рівноцінні, обидва призведе до нульового зчитування
id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];
NSUserDefaults
поверне нуль, якщо ключ не знайдено. Я рекомендував би скористатисяremoveObjectForKey
замість щоб встановити його на нуль.
Ось як перевірити, чи не встановив значення ключа для нуля, видалено ключ NSUserDefaults standardUserDefaults
.
NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
for(NSString *key in keys) {
NSLog(@"Key Name: %@", key);
}
[keys release];
або просто скинути ключ / словник словника NSUserDefaults standardUserDefaults
NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
removeObjectForKey
?
setObject:nil
також видалить об’єкт, а не лише його ключ. Отже, обидві функції викликають абсолютно однаковий результат. Крім того, якщо ви видалите (або встановите на нуль) єдиний збережений об'єкт (і ключ), весь файл .plist буде видалений.
Swift 5.0 + iOS 11 і новіших версій
Обидва способи видаляють значення. Спробував це на дитячому майданчику:
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()
Перед прошивкою 11 це призведе в сериализации nil
в Data
і видасть помилку.