我正在使用+[NSUserDefaults standardUserDefaults]
来存储应用程序设置,其中包含大约十几个字符串值。是否可能永久删除这些值而不仅仅是将它们设置为默认值?
我正在使用+[NSUserDefaults standardUserDefaults]
来存储应用程序设置,其中包含大约十几个字符串值。是否可能永久删除这些值而不仅仅是将它们设置为默认值?
您可以通过以下方式删除应用程序的持久域:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
在 Swift 3 及以后的版本中:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
这与@samvermette的答案类似,但在我看来更加简洁。
这段代码将默认值重置为注册域:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
换句话说,它会删除您在该应用程序中注册的每个键的removeObjectForKey
。
感谢Ken Thomases在此苹果开发者论坛主题上的贡献。
[NSUserDefaults resetStandardUserDefaults]
无法做到这一点,我无法理解。 - jakeboxer你尝试过使用-removeObjectForKey
吗?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
以下是 Swift 的答案:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
一行代码。 - Grace Huang如果 let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
。该代码用于移除应用程序的持久化存储数据,若存在 domainName
变量则执行移除操作。 - Valentin SherginUserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
- Carsten Hagemann在开发过程中,如果需要的话,您也可以重置模拟器并删除所有的NSUserDefaults
。
iOS 模拟器 -> 重置内容和设置...
请记住,这将同时删除模拟器上的所有应用程序和文件。
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
在Swift中:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
当扩展程序使代码更加整洁时,我很喜欢它们:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Swift 5
extension UserDefaults {
func clear() {
guard let domainName = Bundle.main.bundleIdentifier else {
return
}
removePersistentDomain(forName: domainName)
synchronize()
}
}
注意:本答案已更新适用于Swift。
把它放在一行上怎么样?
扩展@Christopher Rogers的答案 - 接受的答案。
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
有时候你可能需要同步它,
[[NSUserDefaults standardUserDefaults] synchronize];
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift?
使用Swift,这将更加容易。
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
使用方法:
UserDefaults.clean()
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
这是一份关于使用Swift实现线程安全单例模式的示例代码。单例模式是一种常见的设计模式,用于创建只有一个实例的类。在多线程环境下使用单例模式时需要特别小心,因为同时访问可能导致竞争条件并破坏单例模式的原则。在这个示例中,通过使用dispatch_once_t机制来确保只有一个实例被创建并且只会在需要时才会创建。