NSUserDefaults removeObjectForKey ile setObject: nil karşılaştırması


116

Aşağıdaki iki satır eşdeğer mi?

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

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


1
Evet, ancak ilki niyetinizi çok daha açık hale getiriyor.
BallpointBen

Yanıtlar:


14

Swift 3.0

Bunu test ettiğimde aşağıdaki cevap artık geçerli değil. Ayarlandığında nilsonucu NSCFData depolanmasını engeller. Muhtemelen bir NSNull nesne referansı, ancak pozitif değilim.

Anahtar kullanımı için bir değeri tamamen kaldırmak için UserDefaults.standard.removeObject(forKey: "YourDefault")

Aşağıdaki kodla test ettim:

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

İlginçtir, Swift'de set (nil, forKey: ...) yazdığımda ve "tanıma atla" seçeneğini kullandığımda, beni URL ayarlayıcıya götürüyor. Bu işleve ilişkin açıklamada "-setURL: forKey, -setObject: forKey: değerinin bir NSData'ya arşivlenmesi dışında eşdeğerdir." Bu, neden yanlış davrandığını açıklayabilir - nil'i kabul eden iki aşırı yüklenmiş işlev olduğundan, Swift birini seçmek zorundadır, ancak setURL aynı şekilde davranmaz.
Richard Venable

96

Evet, her iki kod satırı da eşdeğerdir, her ikisi de sıfır okunmasına neden olur

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

NSUserDefaultsanahtar bulunmazsa sıfır döndürür. Bunu removeObjectForKeysıfır olarak ayarlamak yerine kullanmanızı tavsiye ederim .

Anahtar değerini sıfır olarak ayarlamanın anahtar girişini kaldırıp kaldırmadığını nasıl test edeceğiniz aşağıda açıklanmıştır NSUserDefaults standardUserDefaults.

NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
   for(NSString *key in keys) {
       NSLog(@"Key Name: %@", key);
}
[keys release];

veya basitçe anahtar / değer sözlüğünü boşaltın NSUserDefaults standardUserDefaults

NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

Evet, ama sıfıra ayarlarsanız otomatik olarak removeObjectForKeymı olur?
ma11hew28

"nil" olarak ayarlamanın [NSUserDefaults standardUserDefaults] içindeki anahtar girişini kaldırıp kaldırmayacağından emin değilim. Hızlı bir test, 'allKeys' [[NSUserDefaults standardUserDefaults] allKeys] almak ve anahtar adlarının NSArrya'sını yinelemek, bir anahtarın nil olarak ayarlanmasının anahtarı 'allKey' dizisinden kaldırıp kaldırmadığını bulmaktır.
RocketMan

9
sonuç 'EVET'tir' hem 'removeObjectForKey' hem de 'setObject: nil' [NSUserDefaults standardUserDefaults] 'dan anahtar @ "örnek anahtar" ı
kaldıracak

9
Teşekkürler! Ben de bunu onayladım. Sadece açıklığa kavuşturmak için, setObject:nilnesneyi de kaldıracaktır, sadece anahtarını değil. Yani her iki fonksiyon da tam olarak aynı sonuca neden olur. Ayrıca, saklanan tek nesneyi (ve anahtarı) kaldırırsanız (veya sıfıra ayarlarsanız), .plist dosyasının tamamı silinir.
ma11hew28

1

Swift 5.0 + iOS 11 ve üstü

Her iki yöntem de değeri kaldırır. Bunu bir oyun alanında denedim:

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

İOS 11'den önce bu , serileştirmeye nilneden olur Datave bir hata verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.