NSUserDefaults removeObjectForKey与setObject:nil

ma1*_*w28 113 nsuserdefaults

以下两行是否相同?

1. [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]

2. [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]

Roc*_*Man 95

是的,两行代码都是等效的,都会导致nil读取

id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];
Run Code Online (Sandbox Code Playgroud)

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];
Run Code Online (Sandbox Code Playgroud)

或者简单地转储键/值字典 NSUserDefaults standardUserDefaults

NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Run Code Online (Sandbox Code Playgroud)

  • 结果为'YES''removeObjectForKey'和'setObject:nil'将从[NSUserDefaults standardUserDefaults]中删除键@"示例键" (9认同)
  • 谢谢!我也证实了这一点.只是为了澄清,`setObject:nil`也将删除对象,而不仅仅是它的键.因此,两个函数都会导致完全相同的结果.此外,如果删除(或设置为nil)唯一存储的对象(和键),则会删除整个.plist文件. (9认同)

Sea*_*ean 12

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"))")
Run Code Online (Sandbox Code Playgroud)