【问题标题】:NSUserDefaults removeObjectForKey vs. setObject:nilNSUserDefaults removeObjectForKey 与 setObject:nil
【发布时间】:2011-05-17 15:24:10
【问题描述】:

以下两行是否等价?

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

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

【问题讨论】:

  • 是的,除了第一个让你的意图更加清晰。

标签: nsuserdefaults


【解决方案1】:

是的,两行代码是等价的,都会导致读取为零

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]);

【讨论】:

  • 是的,但是如果你将它设置为 nil 会自动removeObjectForKey?
  • 不确定将其设置为“nil”是否会删除 [NSUserDefaults standardUserDefaults] 中的密钥条目。一个快速的测试是获取 'allKeys' [[NSUserDefaults standardUserDefaults] allKeys] 并遍历键名的 NSArrya,看看将键设置为 nil 是否会从 'allKey' 数组中删除键。
  • 结果是 'YES' 'removeObjectForKey' 和 'setObject:nil' 将从 [NSUserDefaults standardUserDefaults] 中删除键 @"example key"
  • 谢谢!我也证实了这一点。澄清一下,setObject:nil 也会删除对象,而不仅仅是它的键。因此,这两个函数导致完全相同的结果。此外,如果您删除(或设置为 nil)唯一存储的对象(和密钥),则整个 .plist 文件将被删除。
【解决方案2】:

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"))")

【讨论】:

  • 有趣的是,在 Swift 中,当我键入 set(nil, forKey:...) 并使用“跳转到定义”时,它会将我带到 URL 设置器。该函数的注释说“-setURL:forKey 等价于 -setObject:forKey: 只是该值被归档到 NSData。”这可以解释为什么它行为不端 - 因为有两个接受 nil 的重载函数,Swift 必须选择一个,但 setURL 的行为不一样。
【解决方案3】:

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 之前,此 will resultnil 序列化为 Data 并引发错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多