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


当前回答

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

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

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

其他回答

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

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

换句话说,它为你在那个应用中注册的每一个键removeObjectForKey。

感谢Ken Thomases在苹果开发者论坛上的发言。

你试过使用-removeObjectForKey吗?

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

我喜欢扩展,因为它能让代码更简洁:

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

        self.removePersistentDomainForName(domainName)
    }
}

斯威夫特5

extension UserDefaults {
    func clear() {
        guard let domainName = Bundle.main.bundleIdentifier else {
            return
        }
        removePersistentDomain(forName: domainName)
        synchronize()
    }
}

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

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

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

注意: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()