清除NSUserDefaults

我正在使用+[NSUserDefaults standardUserDefaults]来存储应用程序设置。 这由大约十几个string值组成。 是否可以永久删除这些值而不是将其设置为默认值?

您可以像这样删除应用程序的永久域:

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

在Swift 3:

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

这与@samvermette的答案类似,但有点清洁IMO。

此代码将默认设置重置为注册域:

 [[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]]; 

换句话说,它为您在该应用程序中注册的每个单一密钥removeObjectForKey

肯·托马斯在这个苹果开发者论坛线程。

你尝试使用 – removeObjectForKey

  [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"]; 

Swift的答案如下:

 let appDomain = NSBundle.mainBundle().bundleIdentifier! NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain) 

如果你在开发时需要它,你也可以重置你的模拟器,删除所有的NSUserDefaults

iOS模拟器 – >重置内容和设置…

请记住,它也将删除模拟器上的所有应用程序和文件。

 NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; for (NSString *key in [defaultsDictionary allKeys]) { [[NSUserDefaults standardUserDefaults] removeObjectForKey:key]; } 

我find了这个:

 osascript -e 'tell application "iOS Simulator" to quit' xcrun simctl list devices | grep -v '^[-=]' | cut -d "(" -f2 | cut -d ")" -f1 | xargs -I {} xcrun simctl erase "{}" 

来源: https : //gist.github.com/ZevEisenberg/5a172662cb576872d1ab

当他们使代码更清洁时,我喜欢扩展:

 extension NSUserDefaults { func clear() { guard let domainName = NSBundle.mainBundle().bundleIdentifier else { return } self.removePersistentDomainForName(domainName) } } 

在Swift中:

 let defaults = NSUserDefaults.standardUserDefaults() defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) } 

怎么样在一条线上?

扩展@Christopher Rogers回答 – 被接受的答案。

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

是的,有时候你可能需要synchronize它,

 [[NSUserDefaults standardUserDefaults] synchronize]; 

我已经创build了一个方法来做到这一点,

 - (void) clearDefaults { [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]; [[NSUserDefaults standardUserDefaults] synchronize]; } 

这是一个错误或者什么,但removePersistentDomainForName不工作,而清除所有的NSUserDefaults值。

所以,更好的select是重置PersistentDomain ,你可以通过以下方式来完成:

 NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!) 

扩展@ @ folse的答案…我相信更正确的实施将是…

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain]; for (NSString *key in [defaultsDictionary allKeys]) { NSLog(@"removing user pref for %@", key); [[NSUserDefaults standardUserDefaults] removeObjectForKey:key]; } 

调用NSUserDefault的persistentDomainForName:方法。 在docs状态下,方法“返回包含指定持久域中的键和值的字典”。 调用dictionary代表:相反,将返回一个可能包含其他设置的字典,因为它适用于更广的范围。

如果你需要过滤掉任何要重置的值,那么迭代键是实现它的方法。 显然,如果你只是不考虑应用程序的所有前提,那么上面提到的其他方法之一是最有效的。

以上所有的答案是非常相关的,但如果有人仍然无法重置userdefaults为删除的应用程序,那么你可以重置你的模拟器的内容设置,它会工作。 在这里输入图像描述

如果需要重置的应用程序设置是nsuserdefault访问麦克风(我的情况),一个简单的解决scheme是安东尼麦考密克( Iphone – 如何启用应用程序访问设备上的媒体的答案- ALAssetsLibraryErrorDomain代码= -3312“全局拒绝访问” )。

在设备上,转到设置>常规>重置>重置位置警告