NSUserDefaults removeObjectForKey与setObject:nil


116

以下两行等效吗?

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

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


1
是的,除了第一个使您的意图更加清晰。
BallpointBen

Answers:


14

斯威夫特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的行为并不相同。
Richard Venable

96

是的,这两行代码是等效的,都将导致读取为零

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吗?
ma11hew28

不知道是否将其设置为“ nil”会删除[NSUserDefaults standardUserDefaults]中的键项。一个快速的测试是获取'allKeys'[[NSUserDefaults standardUserDefaults] allKeys]并遍历键名称的NSArrya,确定是否将键设置为nil确实会从'allKey'数组中删除键。
RocketMan 2011年

9
结果为“是”,“ removeObjectForKey”和“ setObject:nil”都将从[NSUserDefaults standardUserDefaults]中删除键@“示例键”
RocketMan 2011年

9
谢谢!我也确认了这一点。只是为了澄清,setObject:nil还将删除对象,而不仅仅是其键。因此,这两个函数会导致完全相同的结果。另外,如果删除(或设置为nil)唯一存储的对象(和键),则整个.plist文件将被删除。
ma11hew28

1

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这将导致在序列化nilData并抛出一个错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.