Delete all keys from a NSUserDefaults dictionary iOS

拥有回忆 提交于 2019-12-17 06:29:53

问题


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....


回答1:


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



回答2:


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



回答3:


One-liner:

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



回答4:


Simple Solution

Objective C:

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

In Swift 3.0 :

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



回答5:


Swift version:

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



回答6:


+ (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.




回答7:


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



回答8:


Oneliner in Swift:

Swift 3

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

Swift 4

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



回答9:


For Swift 3:

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



回答10:


For Swift 3:

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



回答11:


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

}



回答12:


Swift
place in your logic

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



回答13:


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.




回答14:


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



回答15:


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


来源:https://stackoverflow.com/questions/6797096/delete-all-keys-from-a-nsuserdefaults-dictionary-ios

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!