下面两行是否相等?
1. [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]
2. [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]
是的,两行代码是等价的,都将导致 nil read
id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];
如果没有找到密钥,NSUserDefaults将返回 null。我建议使用 removeObjectForKey而不是将其设置为 nil。
NSUserDefaults
removeObjectForKey
下面是如何测试将键值设置为 nil 是否从 NSUserDefaults standardUserDefaults中删除了键条目。
NSUserDefaults standardUserDefaults
NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy]; for(NSString *key in keys) { NSLog(@"Key Name: %@", key); } [keys release];
or simply dump the key/value dictionary of NSUserDefaults standardUserDefaults
NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Swift 3.0
当我测试这个时,下面的答案不再是这种情况。 当设置为 nil时,结果是存储 NSCFData。可能是 NSNull 对象引用,但我不确定。
nil
要完全删除键的值,请使用 UserDefaults.standard.removeObject(forKey: "YourDefault")
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"))")
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()
在 iOS11之前,这个 will result在将 nil序列化为 Data时抛出了一个错误。
Data