समाशोधन NSUserDefaults


285

मैं +[NSUserDefaults standardUserDefaults]एप्लिकेशन सेटिंग संग्रहीत करने के लिए उपयोग कर रहा हूं । इसमें लगभग एक दर्जन स्ट्रिंग वैल्यू शामिल हैं। क्या इन मूल्यों को केवल डिफ़ॉल्ट मान पर सेट करने के बजाय स्थायी रूप से हटाना संभव है?


जवाबों:


514

आप इस तरह आवेदन के लगातार डोमेन को हटा सकते हैं:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

स्विफ्ट 3 और बाद में:

if let bundleID = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleID)
}

यह @samvermette द्वारा उत्तर के समान है, लेकिन एक छोटा सा क्लीनर IMO है।


यह महान काम किया, धन्यवाद! बस बाद में appDomain जारी करने के लिए मत भूलना।
1

15
@IcyBlueRose - bundleIdentifier एक ऑटोरेल्ड ऑब्जेक्ट है क्योंकि यह init या नए के साथ शुरू नहीं होता है, इसलिए आप इसे जारी करेंगे।
क्रिस्टोफर रोजर्स

1
जानकर अच्छा लगा, धन्यवाद! लेकिन मैं स्ट्रिंग एपडोमैन के बारे में बात कर रहा था। क्या वह ऑटो भी जारी किया गया है?
IcyBlueRose

2
@IcyBlueRose बंडलडायनिफ़ायर द्वारा लौटाया गया ऑब्जेक्ट वही है जो ऐपडोमैन द्वारा संदर्भित ऑब्जेक्ट है।
क्रिस्टोफर रोजर्स

2
मैं 10.8 पर काम करने के लिए इसे प्राप्त नहीं कर सकता, क्या कोई कृपया पुष्टि कर सकता है कि यह काम करता है? यहाँ एक संबंधित SO प्रश्न है: stackoverflow.com/questions/13595415/…
DaGaMs

102

यह कोड पंजीकरण डोमेन में चूक को रीसेट करता है:

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

दूसरे शब्दों में, यह removeObjectForKeyआपके द्वारा उस ऐप में दर्ज की गई हर एक कुंजी के लिए है।

इस Apple डेवलपर फ़ोरम थ्रेड पर केन थॉमास का श्रेय


4
बहुत बहुत धन्यवाद। ऐसा क्यों [NSUserDefaults resetStandardUserDefaults]नहीं करता है यह मेरे से परे है।
जेकबॉक्सर

2
@jboxer मैंने अभी हाल ही में Apple डॉक्यूमेंटेशन और रीसेटस्टैंडरयूसेडरफेस का अध्ययन करने में कुछ समय बिताया है जो मूल रूप से इन-मेमोरी बफर को डिस्क में फ्लश करता है और उसे साफ करता है। तो अगली बार जब आप एक मान प्राप्त करने की कोशिश करते हैं तो उसे डिस्क से हथियाना पड़ता है। कोर डेटा का NSManagedObjectContext भी इसी तरह के "रीसेट" शब्दावली का उपयोग करता है।
क्रिस्टोफर रोजर्स

2
ओह, मेरा मतलब था कि यह इन-मेमोरी बफर को डिस्क में लिखे बिना मिटा देता है। तो डिस्क में सिंक्रोनाइज़ करने से पहले आपके द्वारा किए गए कोई भी परिवर्तन खो जाएंगे।
क्रिस्टोफर रोजर्स

4
क्रिस्टोफर, मुझे लगता है कि आपके पास यह पीछे है, हालांकि शायद चीजें बदल गईं। resetStandardUserDefaults आईओएस में अब तक देखी गई सबसे भ्रमित करने वाली कॉल है। Apple डॉक्स का कहना है कि "साझा उपयोगकर्ता डिफ़ॉल्ट ऑब्जेक्ट में किए गए किसी भी परिवर्तन को सिंक्रनाइज़ करता है और इसे मेमोरी से रिलीज़ करता है।" तो यह वास्तव में flushAndReleaseStandardUserDefaults कहा जाना चाहिए। मैं एक पुरानी टिप्पणी पर टिप्पणी करने के लिए समय ले रहा हूं क्योंकि मैं अभी इस कॉल से पकड़ा गया हूं और किसी और को जलाए जाने से बचना चाहता हूं (मुझे अब एक क्लाइंट को बताना होगा कि मुझे 90 ऐप अपडेट करने की आवश्यकता है)।
एंडी डेंट

97

क्या आपने प्रयोग करने की कोशिश की - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];

चीयर्स सोबत। बहुत सराहना की।
टोनीनीलोन

5
सभी मौजूदा कुंजियों के लिए ऑब्जेक्ट हटाने का कोई तरीका?
समवसरण

2
जब मैं समझता हूं कि यह काम करने के लिए प्रकट होता है, तो रक्षात्मकता क्यों नहीं है कुछ प्रकार की प्रणाली को निरंतर परिभाषित किया जाता है? मुझे यकीन है कि यह भविष्य में किसी दिन काम करना बंद कर देगा।
डेविड एच

क्या आपको बाद में सिंक्रनाइज़ करना होगा?
ट्रैविस एम।

30

यहाँ स्विफ्ट में जवाब है:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)

8
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)वन-लाइनर
ग्रेस शाओ

3
या सुरक्षित:if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
वैलेंटाइन शेरिन

1
ग्रेस के ऑन्लाइनर का स्विफ्ट 4 संस्करण:UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Carsten Hagemann

28

यदि आपको इसे विकसित करने की आवश्यकता है, तो आप अपने सिम्युलेटर को भी रीसेट कर सकते हैं, सभी को हटा सकते हैं NSUserDefaults

iOS सिम्युलेटर -> सामग्री और सेटिंग्स रीसेट करें ...

ध्यान रखें कि यह सिम्युलेटर पर मौजूद सभी ऐप्स और फ़ाइलों को भी हटा देगा।


15
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}

7

स्विफ्ट में:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }

6

नोट: यह उत्तर स्विफ्ट के लिए भी अपडेट किया गया है।

इसके बारे में एक पंक्ति में क्या है?

@Christopher Rogers का उत्तर देना - स्वीकृत है।

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

और हाँ, कभी-कभी आपको इसकी आवश्यकता हो सकती है synchronize,

[[NSUserDefaults standardUserDefaults] synchronize];

मैंने ऐसा करने के लिए एक विधि बनाई है,

- (void) clearDefaults {
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

स्विफ्ट ?

तेजी से इसके और भी आसान के साथ।

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
        standard.removePersistentDomain(forName: aValidIdentifier)
        standard.synchronize()
    }
}

और उपयोग :

UserDefaults.clean()

6

मुझे एक्सटेंशन पसंद है जब वे कोड क्लीनर बनाते हैं:

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}

स्विफ्ट 5

extension UserDefaults {
    func clear() {
        guard let domainName = Bundle.main.bundleIdentifier else {
            return
        }
        removePersistentDomain(forName: domainName)
        synchronize()
    }
}


2

उपरोक्त सभी उत्तर बहुत ही प्रासंगिक हैं, लेकिन यदि कोई व्यक्ति अभी भी हटाए गए एप्लिकेशन के लिए उपयोगकर्ता-उपयोगकर्ता रीसेट करने में असमर्थ है, तो आप सिम्युलेटर की सामग्री सेटिंग्स को रीसेट कर सकते हैं, और यह काम करेगा।यहां छवि विवरण दर्ज करें


2

यह एक बग या जो कुछ भी है लेकिन removePersistentDomainForNameसभी NSUserDefaultsमूल्यों को साफ करते हुए काम नहीं कर रहा है।

तो, बेहतर विकल्प यह है कि रीसेट करें PersistentDomainऔर आप निम्न तरीकों से कर सकते हैं:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)

1

@ फ़ॉल्स के उत्तर पर विस्तार ... मेरा मानना ​​है कि अधिक सही कार्यान्वयन होगा ...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
    for (NSString *key in [defaultsDictionary allKeys]) {
      NSLog(@"removing user pref for %@", key);
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }

... NSUserDefault's persistentDomainForName: विधि को कॉल करना। डॉक्स स्थिति के रूप में, विधि "एक शब्द देता है जिसमें निर्दिष्ट निरंतर डोमेन में कुंजियाँ और मान होते हैं।" डिक्शनरी रिप्रेसेंटेशन कॉलिंग: इसके बजाय, एक ऐसा शब्दकोश लौटाएगा जिसमें व्यापक पैमाने पर लागू होने के साथ अन्य सेटिंग्स भी शामिल होंगी।

यदि आपको किसी भी मान को रीसेट करने की आवश्यकता है, जिसे रीसेट करना है, तो कुंजियों पर ध्यान देना इसे करने का तरीका है। जाहिर है, अगर आप बिना किसी परवाह के ऐप के लिए सभी प्रीफ्स को सिर्फ न्यूक करना चाहते हैं, तो ऊपर पोस्ट किए गए अन्य तरीकों में से एक सबसे कुशल है।


0

यदि एप्लिकेशन सेटिंग रीसेट करने की आवश्यकता है तो माइक्रोफ़ोन (मेरा मामला) तक पहुंच के लिए nsuserdefault है, एंथनी मैककॉर्मिक ( Iphone - डिवाइस पर मीडिया के लिए एप्लिकेशन एक्सेस कैसे सक्षम किया जाए? ) से एक सरल समाधान का जवाब है? )।

डिवाइस पर, सेटिंग्स> जनरल> रीसेट> स्थान चेतावनी को रीसेट करें


0

यह कोशिश करो, यह मेरे लिए काम कर रहा है।

कोड की एकल पंक्ति

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