NSUserDefaults removeObjectForKey เทียบกับ setObject: nil


116

สองบรรทัดต่อไปนี้เทียบเท่ากันหรือไม่?

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

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


1
ใช่ยกเว้นข้อแรกจะทำให้เจตนาของคุณชัดเจนขึ้นมาก
BallpointBen

คำตอบ:


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 ข้อคิดเห็นสำหรับฟังก์ชันนั้นระบุว่า "-setURL: forKey เทียบเท่ากับ -setObject: forKey: ยกเว้นว่าค่าจะถูกเก็บถาวรไปยัง NSData" สิ่งนี้สามารถอธิบายได้ว่าเหตุใดจึงทำงานผิดปกติ - เนื่องจากมีฟังก์ชันโอเวอร์โหลดสองฟังก์ชันซึ่งยอมรับศูนย์ Swift จึงต้องเลือกหนึ่งฟังก์ชัน แต่ setURL จะไม่ทำงานเหมือนกัน
Richard Venable

96

ใช่โค้ดทั้งสองบรรทัดเทียบเท่ากันทั้งสองบรรทัดจะส่งผลให้ไม่มีการอ่าน

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

NSUserDefaultsจะคืนค่าศูนย์หากไม่พบคีย์ ฉันอยากจะแนะนำให้ใช้removeObjectForKeyแทนการตั้งค่าเป็นศูนย์

นี่คือวิธีทดสอบว่าการตั้งค่าคีย์เป็นศูนย์ลบรายการคีย์ออก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]);

ใช่ แต่ถ้าคุณตั้งค่าเป็นศูนย์จะทำโดยอัตโนมัติremoveObjectForKeyหรือไม่?
ma11hew28

ไม่แน่ใจว่าการตั้งค่าเป็น 'nil' จะลบรายการคีย์ใน [NSUserDefaults standardUserDefaults] หรือไม่ การทดสอบอย่างรวดเร็วคือการรับ 'allKeys' [[NSUserDefaults standardUserDefaults] allKeys] และวนซ้ำผ่าน NSArrya ของชื่อคีย์ดูว่าการตั้งค่าคีย์เป็นศูนย์จะเป็นการลบคีย์ออกจากอาร์เรย์ "allKey" หรือไม่
RocketMan

9
ผลลัพธ์คือ "YES" ทั้ง "removeObjectForKey" และ "setObject: nil" จะลบคีย์ @ "คีย์ตัวอย่าง" จาก [NSUserDefaults standardUserDefaults]
RocketMan

9
ขอบคุณ! ฉันยืนยันเรื่องนี้เช่นกัน เพียงเพื่อชี้แจงsetObject: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 นี้จะส่งผลให้ใน serializing nilเข้าDataและโยนความผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.