75

我使用 NSUserDefaults 字典来存储高分等基本信息,这样当用户关闭应用程序时,数据就不会丢失。无论如何我使用:

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你要存储booleansintegers等等objects。我必须执行什么方法来删除所有键,以便 NSUserDefaults 就像我第一次启动应用程序时一样?

我正在寻找类似的东西:

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

或者也许有一种获取所有键的方法,我必须遍历每个对象,但我不知道如何删除它们。

编辑:

我试过了 :

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

而且我仍然能够获得高分....

4

18 回答 18

149

如果您查看NSUserDefaults 文档,您将看到一个方法- (NSDictionary *) dictionaryRepresentation。在标准用户默认值上使用此方法,您可以获得用户默认值中所有键的列表。然后,您可以使用它来清除用户默认值:

- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}
于 2011-07-22T23:24:35.350 回答
73

以与Alex Nichol 的最佳答案相同的结果执行此操作的最短方法:

NSString *appDomain = NSBundle.mainBundle.bundleIdentifier;
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];
于 2013-09-19T10:59:56.527 回答
45

单线:

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:NSBundle.mainBundle.bundleIdentifier];
于 2014-07-12T04:07:04.807 回答
31

简单的解决方案

目标 C:

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

斯威夫特 3.0 到斯威夫特 5.0:

if let appDomain = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
于 2016-10-14T09:27:44.180 回答
16

+ (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操作结束时,用户默认值的磁盘和内存副本都将不包含应用程序设置的任何值。

于 2012-05-27T03:51:45.930 回答
16

斯威夫特版本:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   
于 2015-03-18T04:24:31.767 回答
11

Swift 中的 Oneliner:

斯威夫特 3

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

斯威夫特 4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
于 2016-05-22T10:40:13.807 回答
10

对于那些想要在测试目标中执行此操作的人,请使用它(因为removePersistentDomain不适用于这种情况)

斯威夫特 3:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
     UserDefaults.standard.removeObject(forKey: key)
}
于 2017-03-27T09:22:06.627 回答
5

对于斯威夫特 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
于 2016-11-27T08:41:01.360 回答
5

对于斯威夫特 3:

if let bundle = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundle)
}
于 2017-02-21T13:45:55.643 回答
2

迅速

func resetUserDefaults(){
  let userDefaults = NSUserDefaults.standardUserDefaults()
  let dict = userDefaults.dictionaryRepresentation() as NSDictionary
        
  for key in dict.allKeys {
    userDefaults.removeObjectForKey(key as! String)
  }
        
  userDefaults.synchronize()      
}
于 2017-04-14T05:18:54.247 回答
2

迅速融入
您的逻辑

if let appDomain = Bundle.main.bundleIdentifier {
  UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
于 2018-09-06T10:30:39.407 回答
1

这种方法不这样做吗:

+ (void)resetStandardUserDefaults

从文档中NSUserDefaults

重置标准用户默认值

同步对共享用户默认对象所做的任何更改并将其从内存中释放。

+ (void)resetStandardUserDefaults

讨论

随后调用standardUserDefaults 使用标准搜索列表创建一个新的共享用户默认对象。

基于此,您可以执行以下操作:

[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

现在应该重置默认值。

于 2011-07-22T23:20:46.117 回答
1

Swift 3 或 4 我们甚至可以将描述的片段简化为这个现代表达式:

func clearAll() {
    let settingsDictionary = userDefaults.dictionaryRepresentation()
    settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
    userDefaults.synchronize()
}
于 2017-08-22T00:08:18.017 回答
1

我发现将代码放在UserDefaults.

斯威夫特 5

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

用法

UserDefaults.clear()
于 2020-08-06T15:53:17.363 回答
0

快速删除所有 UserDefault 值(最新语法)

//remove UserDefaults
if let identifier = Bundle.main.bundleIdentifier {
  UserDefaults.standard.removePersistentDomain(forName: identifier)
  UserDefaults.standard.synchronize()
}
于 2019-04-27T11:43:20.193 回答
0

在 Swift 5.0 以下单行代码就足够了。

UserDefaults.standard.dictionaryRepresentation().keys.forEach(defaults.removeObject(forKey:))
于 2021-11-30T07:09:33.013 回答
-1

我用这个:

UserDefaults.standard.removeAll()
于 2021-12-21T09:40:37.207 回答