web-dev-qa-db-ja.com

NSUserDefaults removeObjectForKey vs. setObject:nil

次の2行は同等ですか?

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

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

110
ma11hew28

Swift 3.

これをテストしたとき、以下の答えはもはや当てはまりません。 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"))")
12
Sean

はい、両方のコード行は同等です。両方ともnil読み取りになります

id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];

キーが見つからなかった場合、NSUserDefaultsはnilを返します。 nilに設定する代わりにremoveObjectForKeyを使用することをお勧めします。

キー値を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]);
94
RocketMan