删除NSUserDefaults字典iOS中的所有密钥
我使用NSUserDefaults字典存储基本信息,如高分等,以便当用户closures应用程序数据不会丢失。 反正我用:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
存储数据。 如果我想存储一个新的高分例如,那么我会做:
[prefs setInteger:1023 forKey:@"highScore"]; [prefs synchronize]; //this is needed in case the app is closed.
后来如果我想检索高分我会做:
[prefs integerForKey:@"highScore"];
无论如何,重点是我存储了很多其他的东西,因为NSUserDefaults enable
您能够存储booleans
, integers
, objects
等。我需要执行什么方法来删除所有的密钥,以便NSUserDefaults变得像我第一次启动应用程序的时候?
我正在寻找像这样的东西:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs deleteAllKeysAndObjectsInTheDictionary];
或者也许有一种方法获得所有的密钥,我必须循环通过每个对象,但我不知道如何删除它们。
编辑:
我努力了 :
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [NSUserDefaults resetStandardUserDefaults]; [prefs synchronize];
我仍然能够获得高分….
如果你看看NSUserDefaults文档,你会看到一个方法- (NSDictionary *) dictionaryRepresentation
。 在标准用户默认值上使用这种方法,可以得到用户默认值中所有键的列表。 然后你可以使用这个来清除用户的默认值:
- (void)resetDefaults { NSUserDefaults * defs = [NSUserDefaults standardUserDefaults]; NSDictionary * dict = [defs dictionaryRepresentation]; for (id key in dict) { [defs removeObjectForKey:key]; } [defs synchronize]; }
最简单的方法来做到这一点,就像Alex Nichol的最佳答案一样:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
一个class轮
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
+ (void) resetStandardUserDefaults
不会保留更改,它只是重置内存中的用户默认值对象,以便下一个synchronize
调用将从磁盘拷贝中读取,而不是使用磁盘上的内容覆盖现有的内存中的值版本。
遍历键是更好的,但实际上有一个函数为你做这个: 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];
在synchronize
操作结束时,用户默认的磁盘和内存副本将不包含您的应用程序设置的任何值。
简单的scheme
目标C:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
在Swift 3.0中:
if let appDomain = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: appDomain) }
Swift版本:
if let bid = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid) }
对于Swift 3:
let appDomain = Bundle.main.bundleIdentifier! UserDefaults.standard.removePersistentDomain(forName: appDomain)
对于Swift 3:
if let bundle = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: bundle) }
对于那些想要在testing目标中执行此操作的人,请使用此方法(因为removePersistentDomain
在这种情况下不起作用)
Swift 3:
for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) { UserDefaults.standard.removeObject(forKey: key) }
Oneliner in Swift:
Swift 3
NSUserDefaults.standardUserDefaults().removePersistentDomainForName( NSBundle.mainBundle().bundleIdentifier!)
斯威夫特4
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Swift 2.3:
if let bundleIdentifierBinded = NSBundle.mainBundle().bundleIdentifier{ NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifierBinded) }
迅速
func resetUserDefaults(){ let userDefaults = NSUserDefaults.standardUserDefaults() let dict = userDefaults.dictionaryRepresentation() as NSDictionary for key in dict.allKeys { userDefaults.removeObjectForKey(key as! String) } userDefaults.synchronize() }
这种方法不是这样做的:
+ (void)resetStandardUserDefaults
从NSUserDefaults
的文档:
resetStandardUserDefaults
同步对共享用户默认对象所做的任何更改,并将其从内存中释放。
+ (void)resetStandardUserDefaults
讨论
standardUserDefaults的后续调用使用标准search列表创build新的共享用户默认值对象。
基于此,你可以这样做:
[NSUserDefaults resetStandardUserDefaults]; [NSUserDefaults standardUserDefaults];
现在应该重置默认值。
Swift 3或4我们甚至可以将描述片段简化为这个现代expression式:
func clearAll() { let settingsDictionary = userDefaults.dictionaryRepresentation() settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) } userDefaults.synchronize() }