清除NSUserDefaults

时间:2009-02-13 07:49:08

标签: ios objective-c cocoa-touch nsuserdefaults

我正在使用+[NSUserDefaults standardUserDefaults]来存储应用程序设置。这包含大约十几个字符串值。是否可以永久删除这些值而不是仅将它们设置为默认值?

15 个答案:

答案 0 :(得分:505)

您可以删除应用程序的持久域,如下所示:

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

在Swift 3及更高版本中:

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

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

答案 1 :(得分:102)

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

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

换句话说,对于您在该应用中注册的每一个密钥,它都是removeObjectForKey

在此Apple开发者论坛上致Ken Thomases的信用thread.

答案 2 :(得分:96)

您是否尝试过使用 - removeObjectForKey

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

答案 3 :(得分:30)

以下是Swift的答案:

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

答案 4 :(得分:28)

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

iOS模拟器 - >重置内容和设置...

请记住,它还会删除模拟器上的所有应用和文件。

答案 5 :(得分:14)

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

答案 6 :(得分:7)

在斯威夫特:

nil

答案 7 :(得分:5)

我发现了这个:

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

答案 8 :(得分:5)

注意:此答案也已针对Swift进行了更新。

如何将它放在一条线上?

延长@Christopher Rogers的答案 - 接受的答案。

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

是的,有时您可能需要synchronize

[[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 false }
        self.standard.removePersistentDomain(forName: aValidIdentifier)
        self.standard.synchronize()
    }
}

使用情况

UserDefaults.clean()

答案 9 :(得分:5)

我喜欢扩展,因为他们使代码更清晰:

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

        self.removePersistentDomainForName(domainName)
    }
}

答案 10 :(得分:2)

以上所有答案都非常相关,但是如果有人仍然无法重置已删除应用的用户默认设置,那么您可以重置模拟器的内容设置,它会起作用。enter image description here

答案 11 :(得分:2)

这是一个错误或其他问题,但removePersistentDomainForName在清除所有NSUserDefaults值时无效。

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

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

答案 12 :(得分:1)

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

答案 13 :(得分:0)

如果需要重置的应用程序设置是nsuserdefault来访问麦克风(我的情况),一个简单的解决方案是Anthony McCormick(Iphone - How to enable application access to media on the device? - ALAssetsLibraryErrorDomain Code=-3312 "Global denied access")的答案。

在设备上,转到设置&gt;常规&gt;重置&gt;重置位置警告

答案 14 :(得分:0)

试试这个,这对我有用。

单行代码

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