Answers:
斯威夫特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
如果找不到密钥,将返回nil。我建议使用removeObjectForKey
而不是将其设置为nil。
这是测试如何将键值设置为nil从中删除键条目的方法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
还将删除对象,而不仅仅是其键。因此,这两个函数会导致完全相同的结果。另外,如果删除(或设置为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()
此前的iOS 11这将导致在序列化nil
到Data
并抛出一个错误。