NSUserDefaults removeObjectForKeyとsetObject:nil


116

次の2行は同等ですか?

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

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


1
はい、最初のものを除いてあなたの意図がはるかに明確になります。
BallpointBen 2017

回答:


14

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セッターに移動します。その関数のコメントは、「値がNSDataにアーカイブされることを除いて、-setURL:forKeyは-setObject:forKey:と同等です。」と述べています。これは、正しく動作しない理由を説明する可能性があります。nilを受け入れるオーバーロードされた関数が2つあるため、Swiftはいずれかを選択する必要がありますが、setURLは同じように動作しません。
Richard Venable

96

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

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

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

ここでは、キー値を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 '19年

「nil」に設定すると、[NSUserDefaults standardUserDefaults]のキーエントリが削除されるかどうかは不明です。簡単なテストは、「allKeys」[[NSUserDefaults standardUserDefaults] allKeys]を取得して、キー名のNSArryaを反復処理し、キーをnilに設定しても「allKey」配列からキーが削除されるかどうかを確認することです。
RocketMan、

9
結果は「はい」です。「removeObjectForKey」と「setObject:nil」はどちらも[NSUserDefaults standardUserDefaults]からキー@ "example key"を削除します
RocketMan

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より前のバージョンで、シリアルnil化されDataてエラーがスローされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.