清除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“全局拒绝访问” )。
在设备上,转到设置>常规>重置>重置位置警告