Câu trả lời:
Swift 3.0
Câu trả lời dưới đây không còn là trường hợp khi tôi kiểm tra điều này. Khi được đặt thành nil
kết quả là NSCFData được lưu trữ. Có thể là một tham chiếu đối tượng NSNull, nhưng tôi không khẳng định.
Để xóa hoàn toàn một giá trị cho việc sử dụng khóa UserDefaults.standard.removeObject(forKey: "YourDefault")
Tôi đã thử nghiệm với mã sau:
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"))")
Có, cả hai dòng mã đều tương đương nhau, cả hai sẽ dẫn đến không đọc
id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];
NSUserDefaults
sẽ trả về nil nếu không tìm thấy khóa. Tôi khuyên bạn nên sử dụng removeObjectForKey
thay vì đặt nó thành nil.
đây là cách kiểm tra xem việc đặt giá trị khóa thành nil có xóa mục nhập khóa khỏi không NSUserDefaults standardUserDefaults
.
NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
for(NSString *key in keys) {
NSLog(@"Key Name: %@", key);
}
[keys release];
hoặc đơn giản là kết xuất từ điển khóa / giá trị của NSUserDefaults standardUserDefaults
NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
removeObjectForKey
không?
setObject:nil
cũng sẽ loại bỏ đối tượng, không chỉ khóa của nó. Vì vậy, cả hai hàm đều gây ra cùng một kết quả. Ngoài ra, nếu bạn xóa (hoặc đặt thành nil) đối tượng được lưu trữ duy nhất (và khóa), toàn bộ tệp .plist sẽ bị xóa.
Swift 5.0 + iOS 11 trở lên
Cả hai phương pháp đều xóa giá trị. Đã thử điều này trong một sân chơi:
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()
Trước iOS 11, điều này sẽ dẫn đến việc tuần tự hóa nil
vào Data
và gây ra lỗi.