NSUserDephaults সাফ করা হচ্ছে


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

এটি @ সামভারমেট এর উত্তরের মতো তবে এটি সামান্য ক্লিনার আইএমও।


এটি দুর্দান্ত কাজ করেছে, ধন্যবাদ! এরপরেই অ্যাপডোমেন প্রকাশ করতে ভুলবেন না।
IcyBlueRose

15
@ আইসিব্লিউরোজ - বান্ডিলআইডিটিফায়ার একটি স্বাবলম্বিত বস্তু যেহেতু এটি আরম্ভ করে বা নতুন দিয়ে শুরু হয় না, তাই আপনি এটি অতিরিক্ত ছাড়বেন।
ক্রিস্টোফার রজার্স

1
জেনে রাখা ভাল, আপনাকে ধন্যবাদ! তবে আমি স্ট্রিং অ্যাপডোমেন সম্পর্কে বলছিলাম। সেই অটোও কি মুক্তি পেয়েছে?
আইসি ব্লুরোজ

2
@ আইসিব্লিউরোজ বস্তুটি বান্ডিলআইডিটিফায়ার দ্বারা ফিরিয়ে দেওয়া অ্যাপডোমাইন দ্বারা রেফারেন্স করা বস্তুর সমান।
ক্রিস্টোফার রজার্স

2
আমি এটি আর 10.8-এ কাজ করতে পারব বলে মনে হচ্ছে না, কেউ দয়া করে নিশ্চিত হয়ে উঠতে পারে যে এটি কাজ করে? এখানে একটি সম্পর্কিত তাই প্রশ্ন stackoverflow.com/questions/13595415/...
DaGaMs

102

এই কোডটি রেজিস্ট্রেশন ডোমেনে ডিফল্টগুলি পুনরায় সেট করে:

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

অন্য কথায়, এটি removeObjectForKeyআপনি যে অ্যাপ্লিকেশনটিতে নিবন্ধভুক্ত প্রতিটি একক কী এর জন্য।

এই অ্যাপল বিকাশকারী ফোরামের থ্রেডে কেন থমাসেসকে ক্রেডিট


4
একটি গুচ্ছ ধন্যবাদ। কেন [NSUserDefaults resetStandardUserDefaults]এটি না করা আমার বাইরে।
jakeboxer

2
@ জবক্সার আমি কেবলমাত্র অ্যাপল ডকুমেন্টেশন এবং রিসেটস স্ট্যান্ডার্ড ইউজারডেফাল্টস অধ্যয়নের জন্য কিছুটা সময় ব্যয় করেছি মূলত ইন-মেমরি বাফারটিকে ডিস্কে ফ্লাশ করে এবং এটি পরিষ্কার করে। সুতরাং পরের বার আপনি এটির ডিস্ক থেকে ধরে নিতে একটি মান পুনরুদ্ধার করার চেষ্টা করবেন। কোর ডেটার NSManagedObjectContext এছাড়াও অনুরূপ "রিসেট" পরিভাষা ব্যবহার করে।
ক্রিস্টোফার রজার্স

2
ওফস, আমি বোঝাতে চাইছি এটি ডিস্কে না লিখে এটি ইন-মেমরি বাফারটি মোছা। সুতরাং ডিস্কে সিঙ্ক্রোনাইজ করার আগে আপনার যে কোনও পরিবর্তনগুলি হারিয়ে যাবে।
ক্রিস্টোফার রজার্স

4
ক্রিস্টোফার, আমার মনে হয় আপনার পেছনের দিকে আছে যদিও জিনিসগুলি পরিবর্তিত হয়েছে। রিসেটস স্ট্যান্ডার্ডউজারডেফাল্টস হ'ল আইওএস-এ আমি এখন পর্যন্ত দেখেছি সবচেয়ে বিভ্রান্তিকরভাবে নামযুক্ত কল। অ্যাপল ডক্স বলছে "ভাগ করা ব্যবহারকারীর ডিফল্ট অবজেক্টে করা যেকোনো পরিবর্তন সিঙ্ক্রোনাইজ করে এবং এটিকে মেমরি থেকে ছেড়ে দেয়" " সুতরাং এটিকে সত্যই ফ্লাশঅ্যান্ডরিলেজস স্ট্যান্ডার্ডসুজারডেফল্টস বলা উচিত। আমি একটি পুরানো মন্তব্যে মন্তব্য করার জন্য সময় নিচ্ছি কারণ আমি এই কলটি পেয়েছি এবং অন্য কারও পোড়া হওয়া এড়াতে চাই (এখন আমাকে ক্লায়েন্টকে বলতে হবে যে আমার 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!)
কার্স্টেন হেগম্যান

28

বিকাশের সময় আপনার যদি এটির প্রয়োজন হয় তবে আপনি সমস্ত সরিয়ে মুছে নিজের সিমুলেটরটিও পুনরায় সেট করতে পারেন NSUserDefaults

আইওএস সিমুলেটর -> সামগ্রী এবং সেটিংস পুনরায় সেট করুন ...

মনে রাখবেন যে এটি সিমুলেটারের সমস্ত অ্যাপ্লিকেশন এবং ফাইলগুলিও মুছে ফেলবে।


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


6

দ্রষ্টব্য: এই উত্তরটি সুইফ্টের জন্যও আপডেট করা হয়েছে।

এটি কি এক লাইনে আছে?

@ ক্রিসটফার রজার্সের উত্তর বাড়ানো - স্বীকৃত একটি one

[[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];
    }

... এনএসইউসারডেফল্টের অবিচলিত ডোমেনফোর্ডনাম: পদ্ধতিতে কল করা হচ্ছে। দস্তাবেজগুলির বিবরণ হিসাবে, পদ্ধতিটি "নির্দিষ্ট ধ্রুবক ডোমেনে কী এবং মানগুলি সম্বলিত একটি অভিধান প্রদান করে" " অভিধানকে কল করাপরিবর্তন: পরিবর্তে, এমন একটি অভিধান প্রদান করবে যা সম্ভবত অন্যান্য সেটিংসকে অন্তর্ভুক্ত করবে কারণ এটি বিস্তৃত সুযোগের ক্ষেত্রে প্রযোজ্য।

যদি আপনাকে পুনরায় সেট করতে হয় এমন মানগুলির কোনও ফিল্টার করতে হয় তবে কীগুলির মাধ্যমে পুনরাবৃত্তি হ'ল এটি করার উপায়। স্পষ্টতই, আপনি যদি অ্যাপ্লিকেশনটির জন্য কেবলমাত্র সমস্ত প্রিফকেই বিবেচনা না করেই চান, তবে উপরের পোস্ট করা অন্য একটি পদ্ধতি সবচেয়ে কার্যকর।


0

যদি অ্যাপ্লিকেশন সেটিংটির পুনঃনির্ধারণের প্রয়োজন হয় মাইক্রোফোনে অ্যাক্সেসের জন্য nsuserdefault (আমার কেস), অ্যান্টনি ম্যাককর্মিকের আইফোন থেকে একটি সহজ সমাধানের উত্তর দেওয়া হয়েছে ( আইফোন - ডিভাইসে মিডিয়াতে অ্যাপ্লিকেশন অ্যাক্সেসকে কীভাবে সক্ষম করা যায়? - ALAssetsLibraryErrorDomain Code = -3312 "গ্লোবাল অস্বীকৃত অ্যাক্সেস" )।

ডিভাইসে, সেটিংস> সাধারণ> রিসেট> অবস্থান সতর্কতা পুনরায় সেট করুন এ যান


0

এটি চেষ্টা করুন, এটা আমার জন্য কাজ করছে।

কোডের একক লাইন

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.