NSUserDefaults removeObjectForKey与setObject:nil

时间:2011-05-17 15:24:11

标签: nsuserdefaults

以下两行是否相同?

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

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

3 个答案:

答案 0 :(得分:94)

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

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

答案 1 :(得分:11)

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

答案 2 :(得分: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之前,此will resultnil序列化为Data并引发错误。