删除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您能够存储booleansintegersobjects等。我需要执行什么方法来删除所有的密钥,以便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() }