从NSUserDefaults字典iOS中删除所有键

Ton*_*Nam 64 cocoa-touch objective-c nsuserdefaults ios swift

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

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
Run Code Online (Sandbox Code Playgroud)

存储数据.如果我希望存储一个新的高分,那么我会这样做:

[prefs setInteger:1023 forKey:@"highScore"];
[prefs synchronize];  //this is needed in case the app is closed. 
Run Code Online (Sandbox Code Playgroud)

后来如果我想获得高分我会做:

[prefs integerForKey:@"highScore"];
Run Code Online (Sandbox Code Playgroud)

反正问题是,我储存很多其他的事情,因为NSUserDefaults enable你存储booleans,integers,objects等我有什么方法来执行删除所有键,以便成为NSUserDefaults的像拳头时我启动应用程序?

我正在寻找类似的东西:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我试过了 :

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*hol 146

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

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

  • 使用相同结果执行此操作的最短方式:`______________________________________________``NSString*appDomain = [[NSBundle mainBundle] bundleIdentifier];``__________________``[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; ` (18认同)
  • 这不是最好的方法,因为它会迭代并尝试删除*所有*用户默认键,包括系统键,而不仅仅是应用键。使用 -removePersistentDomainForName: 正如另一个答案中所建议的那样要好得多。 (9认同)

sky*_*der 71

使用与 Alex Nichol的最佳答案相同的结果来做到这一点的最短路径:

NSString *appDomain = NSBundle.mainBundle.bundleIdentifier;
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)


Cam*_*n E 44

一个班轮

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:NSBundle.mainBundle.bundleIdentifier];
Run Code Online (Sandbox Code Playgroud)

  • 从 iOS 11 开始,同步已被弃用。 (3认同)

Sou*_*rma 25

简单解决方案

目标C:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Run Code Online (Sandbox Code Playgroud)

Swift 3.0中:

if let appDomain = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
Run Code Online (Sandbox Code Playgroud)


dar*_*s0n 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];
Run Code Online (Sandbox Code Playgroud)

synchronize操作结束时,用户默认值的磁盘和内存副本将不包含应用程序设置的任何值.


sup*_*org 16

Swift版本:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   
Run Code Online (Sandbox Code Playgroud)


net*_*000 9

Swift的Oneliner:

斯威夫特3

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)
Run Code Online (Sandbox Code Playgroud)

斯威夫特4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Run Code Online (Sandbox Code Playgroud)


bog*_*gen 9

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

斯威夫特3:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
     UserDefaults.standard.removeObject(forKey: key)
}
Run Code Online (Sandbox Code Playgroud)


Tai*_*ato 5

对于Swift 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
Run Code Online (Sandbox Code Playgroud)


Jay*_*hta 5

对于Swift 3:

if let bundle = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundle)
}
Run Code Online (Sandbox Code Playgroud)