NSUserDefaults removeObjectForKey बनाम setObject: nil


116

क्या निम्नलिखित दो पंक्तियाँ समान हैं?

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

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


1
हां, पहले को छोड़कर आपका इरादा बहुत अधिक स्पष्ट है।
BallpointBen

जवाबों:


14

स्विफ्ट 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"))")

दिलचस्प है, स्विफ्ट में, जब मैं सेट (nil, forKey: ...) टाइप करता हूं, और "जम्प टू डेफिनिशन" का उपयोग करता हूं, तो यह मुझे URL सेटर पर ले जाता है। उस फ़ंक्शन के लिए टिप्पणी कहती है "-setURL: forKey -setObject के बराबर है: forKey: सिवाय इसके कि मान एक NSData में संग्रहीत है।" यह समझा सकता है कि यह दुर्व्यवहार क्यों है - चूंकि दो अतिभारित कार्य हैं जो शून्य को स्वीकार करते हैं, स्विफ्ट को एक चुनना पड़ता है, लेकिन सेटर्ल एक ही व्यवहार नहीं करता है।
रिचर्ड वेनबल

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

सुनिश्चित नहीं है कि अगर इसे 'एनआईएल' में सेट किया जाता है तो [एनएसयूसेरडेफॉल्ट्स स्टैंडर्डयूसेडरफॉल्ट्स] में प्रमुख प्रविष्टि को हटा दिया जाएगा। एक त्वरित परीक्षण 'allKeys' [[NSUserDefaults standardUserDefaults] allKeys] प्राप्त करना और मुख्य नामों के NSArrya के माध्यम से पुनरावृत्ति करना होगा, यह पता लगाना कि क्या शून्य की कुंजी सेट करना 'allKey' सरणी से कुंजी को हटाता है।
रॉकेटमैन

9
परिणाम 'YES' दोनों 'removeObjectForKey' और 'setObject: nil' कुंजी को "NSUserDefaults standardUserDefaults" से कुंजी @ "उदाहरण कुंजी" को हटा देगा
Rocket

9
धन्यवाद! मैंने भी इसकी पुष्टि की। बस स्पष्ट करने के लिए, setObject:nilवस्तु को हटा देगा, न कि केवल इसकी कुंजी को। तो, दोनों फ़ंक्शन समान परिणाम का कारण बनते हैं। इसके अलावा, यदि आप केवल संग्रहीत ऑब्जेक्ट (और कुंजी) को हटाते हैं (या शून्य पर सेट करते हैं), संपूर्ण .plist फ़ाइल हटा दी जाती है।
ma11hew28

1

स्विफ्ट 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()

आईओएस 11 इससे पहले परिणाम होगा serializing में nilमें Dataऔर एक त्रुटि फेंक देते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.