我使用+[NSUserDefaults standardUserDefaults]来存储应用程序设置。它由大约12个字符串值组成。是否可以永久删除这些值,而不是将它们设置为默认值?


当前回答

试试这个,对我很有效。

单行代码

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

其他回答

我发现了这个:

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

你试过使用-removeObjectForKey吗?

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

你可以像这样删除应用程序的持久域:

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

在Swift 3及以后版本中:

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

这与@samvermette的回答相似,但在我看来更简洁一些。

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

扩展@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:方法。正如文档声明的那样,该方法“返回一个包含指定持久域中键和值的字典”。相反,调用dictionaryRepresentation:将返回一个可能包含其他设置的字典,因为它应用于更广泛的范围。

如果您需要过滤掉任何要重置的值,那么迭代键就是一种方法。显然,如果你只是想核爆应用程序的所有prefs,那么上面发布的其他方法之一是最有效的。