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


当前回答

这是一个bug或者什么,但是removePersistentDomainForName在清除所有NSUserDefaults值时不起作用。

所以,更好的选择是重置PersistentDomain,你可以通过以下方式来做:

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

其他回答

你试过使用-removeObjectForKey吗?

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

扩展@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,那么上面发布的其他方法之一是最有效的。

如果应用程序设置需要重置是nsuserdefault访问麦克风(我的情况下),一个简单的解决方案是回答从安东尼麦考密克(Iphone -如何启用应用程序访问设备上的媒体?- ALAssetsLibraryErrorDomain Code=-3312 "Global denied access")。

>常规>复位>复位位置警告

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

注意:Swift也更新了这个答案。

把它写在一行上怎么样?

扩展@Christopher Rogers的回答——公认的答案。

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

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

[[NSUserDefaults standardUserDefaults] synchronize];

我创建了一个方法,

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

迅速?

有了迅捷,它就更容易了。

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
        standard.removePersistentDomain(forName: aValidIdentifier)
        standard.synchronize()
    }
}

和用法:

UserDefaults.clean()