Delete all keys from a NSUserDefaults dictionary iOS

IosObjective CSwiftCocoa TouchNsuserdefaults

Ios Problem Overview


I use the NSUserDefaults dictionary to store basic information such as high scores etc so that when the user closes the app data is not lost. Anyways I use:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

to store data. If I wish to store a new high score for example then I would do:

[prefs setInteger:1023 forKey:@"highScore"];
[prefs synchronize];  //this is needed in case the app is closed. 

and later if I wish to retrieve the high score I would do:

[prefs integerForKey:@"highScore"];

anyways the point is that I store a lot of other things because the NSUserDefaults enable you to store booleans, integers, objects etc. what method would I have to execute to delete all keys so that NSUserDefaults becomes like the fist time I launch the app?

I am looking for something like:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];

or maybe there is a way of getting all keys and I have to loop through each object but I don't know how to remove them.

EDIT:

I have tried :

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];

and I still am able to retrieve a high score....

Ios Solutions


Solution 1 - Ios

If you have a look at the NSUserDefaults documentation you will see a method - (NSDictionary *) dictionaryRepresentation. Using this method on the standard user defaults, you can get a list of all keys in the user defaults. You can then use this to clear the user defaults:

- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}

Solution 2 - Ios

Shortest way to do this with the same results like in Alex Nichol's top answer:

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

Solution 3 - Ios

One-liner:

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

Solution 4 - Ios

Simple Solution

Objective C:

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

Swift 3.0 to Swift 5.0 :

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

Solution 5 - Ios

+ (void) resetStandardUserDefaults doesn't persist the changes, it simply resets the in-memory user defaults object so that the next synchronize call will read from the on-disk copy, instead of overwriting existing in-memory values with the on-disk versions.

Iterating over the keys is better, but there's actually a function that does this for you: removePersistentDomainForName:.

// you can usually get the domain via [[NSBundle mainBundle] bundleIdentifier]
[[NSUserDefaults standardUserDefaults]
 removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
// or use a string for any other settings domains you use
//[[NSUserDefaults standardUserDefaults]
// removePersistentDomainForName:@"com.mycompany.myappname"];
[[NSUserDefaults standardUserDefaults] synchronize];

At the end of the synchronize operation, both the disk and memory copies of user defaults will contain none of the values set by your application.

Solution 6 - Ios

Swift version:

if let bid = NSBundle.mainBundle().bundleIdentifier {
	NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   

Solution 7 - Ios

Oneliner in Swift:

Swift 3

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)

Swift 4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

Solution 8 - Ios

For those of you that want to do this in the test target, use this (as the removePersistentDomain does not work for that case)

Swift 3:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
     UserDefaults.standard.removeObject(forKey: key)
}

Solution 9 - Ios

For Swift 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)

Solution 10 - Ios

For Swift 3:

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

Solution 11 - Ios

Swift

func resetUserDefaults(){
  let userDefaults = NSUserDefaults.standardUserDefaults()
  let dict = userDefaults.dictionaryRepresentation() as NSDictionary
        
  for key in dict.allKeys {
    userDefaults.removeObjectForKey(key as! String)
  }
        
  userDefaults.synchronize()      
}

Solution 12 - Ios

Swift
place in your logic

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

Solution 13 - Ios

Does this method not do that:

+ (void)resetStandardUserDefaults

From the documentation for NSUserDefaults:

> resetStandardUserDefaults > > Synchronizes any changes made to the shared user defaults object and > releases it from memory. > > + (void)resetStandardUserDefaults > > Discussion > > A subsequent invocation of standardUserDefaults creates a new shared > user defaults object with the standard search list.

Based on this, you can do:

[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

and now the defaults should be reset.

Solution 14 - Ios

Swift 3 or 4 We can even simplify described snippet into this modern expression:

func clearAll() {
    let settingsDictionary = userDefaults.dictionaryRepresentation()
    settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
    userDefaults.synchronize()
}

Solution 15 - Ios

I found it the most handy to place the code in an extension on UserDefaults.

Swift 5

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

Usage

UserDefaults.clear()

Solution 16 - Ios

To remove all UserDefault value in swift (Latest syntax)

//remove UserDefaults
if let identifier = Bundle.main.bundleIdentifier {
  UserDefaults.standard.removePersistentDomain(forName: identifier)
  UserDefaults.standard.synchronize()
}

Solution 17 - Ios

In Swift 5.0 below single line of code is enough.

UserDefaults.standard.dictionaryRepresentation().keys.forEach(defaults.removeObject(forKey:))

Solution 18 - Ios

I use this:

UserDefaults.standard.removeAll()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTono NamView Question on Stackoverflow
Solution 1 - IosAlex NicholView Answer on Stackoverflow
Solution 2 - IosskywinderView Answer on Stackoverflow
Solution 3 - IosCameron EView Answer on Stackoverflow
Solution 4 - IosSourabh SharmaView Answer on Stackoverflow
Solution 5 - Iosuser244343View Answer on Stackoverflow
Solution 6 - Iossuperarts.orgView Answer on Stackoverflow
Solution 7 - Iosnetshark1000View Answer on Stackoverflow
Solution 8 - IosbogenView Answer on Stackoverflow
Solution 9 - IosTaichi KatoView Answer on Stackoverflow
Solution 10 - IosJay MehtaView Answer on Stackoverflow
Solution 11 - IosDhananjay PatilView Answer on Stackoverflow
Solution 12 - IosSai kumar ReddyView Answer on Stackoverflow
Solution 13 - IosPengOneView Answer on Stackoverflow
Solution 14 - IosDzmitry ChyrtaView Answer on Stackoverflow
Solution 15 - IosIron John BonneyView Answer on Stackoverflow
Solution 16 - IosHardik ThakkarView Answer on Stackoverflow
Solution 17 - IosNareshView Answer on Stackoverflow
Solution 18 - IosMahdi MoqadasiView Answer on Stackoverflow