Удалить все ключи из словаря NSUserDefaults iOS - PullRequest
60 голосов
/ 23 июля 2011

Я использую словарь NSUserDefaults для хранения базовой информации, такой как рекорды и т. Д., Чтобы при закрытии пользователя приложение не потеряло данные. В любом случае я использую:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

для хранения данных. Например, если я хочу сохранить новый рекорд, я бы сделал:

[prefs setInteger:1023 forKey:@"highScore"];
[prefs synchronize];  //this is needed in case the app is closed. 

и позже, если бы я хотел получить высокий балл, я бы сделал:

[prefs integerForKey:@"highScore"];

В любом случае дело в том, что я храню много других вещей, потому что NSUserDefaults enable вы должны хранить booleans, integers, objects и т. Д., Какой метод мне нужно будет выполнить, чтобы удалить все ключи, чтобы NSUserDefaults становится как в первый раз, когда я запускаю приложение?

Я ищу что-то вроде:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];

или, может быть, есть способ получить все ключи, и мне приходится перебирать каждый объект, но я не знаю, как их удалить.

EDIT:

Я пробовал:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];

и я все еще могу получить высокий балл ....

Ответы [ 15 ]

142 голосов
/ 23 июля 2011

Если вы посмотрите документацию NSUserDefaults , вы увидите метод - (NSDictionary *) dictionaryRepresentation. Используя этот метод для стандартных пользовательских настроек по умолчанию, вы можете получить список всех ключей в пользовательских настройках по умолчанию. Затем вы можете использовать это, чтобы очистить пользовательские настройки по умолчанию:

- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}
70 голосов
/ 19 сентября 2013

Кратчайший способ сделать это с теми же результатами как в главном ответе Алекса Никола:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];
44 голосов
/ 12 июля 2014

Один лайнер

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
23 голосов
/ 14 октября 2016

Простое решение

Цель C:

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

В Swift 3.0:

if let appDomain = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
16 голосов
/ 18 марта 2015

Swift версия:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   
16 голосов
/ 27 мая 2012

+ (void) resetStandardUserDefaults не сохраняет изменения, он просто сбрасывает объект по умолчанию в памяти пользователя, так что следующий вызов synchronize будет читать из копии на диске, а не перезаписывать существующие значения в памяти с помощью версии на диске.

Итерирование по клавишам лучше, но на самом деле есть функция, которая сделает это за вас: removePersistentDomainForName:.

// you can usually get the domain via [[NSBundle mainBundle] bundleIdentifier]
[[NSUserDefaults standardUserDefaults]
 removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
// or use a string for any other settings domains you use
//[[NSUserDefaults standardUserDefaults]
// removePersistentDomainForName:@"com.mycompany.myappname"];
[[NSUserDefaults standardUserDefaults] synchronize];

В конце операции synchronize копии диска и памяти пользовательских настроек по умолчанию не содержат значений, установленных вашим приложением.

9 голосов
/ 27 марта 2017

Для тех из вас, кто хочет сделать это в тестовой цели, используйте это (поскольку removePersistentDomain не работает для этого случая)

Swift 3:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
     UserDefaults.standard.removeObject(forKey: key)
}
8 голосов
/ 22 мая 2016

Oneliner в Swift:

Swift 3

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)

Swift 4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
5 голосов
/ 21 февраля 2017

Для Swift 3:

if let bundle = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundle)
}
5 голосов
/ 27 ноября 2016

Для Swift 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
...