Удалить все ключи из словаря NSUserDefaults iOS
Я использую словарь 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 etc. какой метод мне нужно выполнить, чтобы удалить все ключи, чтобы NSUserDefaults стал похож на первый раз, когда я запускаю приложение?
Я ищу что-то вроде:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];
или, может быть, есть способ получить все ключи, и я должен перебирать каждый объект, но я не знаю, как их удалить.
EDIT:
Я пробовал :
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];
и я все еще в состоянии получить высокий балл....
14 ответов:
Если вы посмотрите на документация NSUserDefaults вы увидите способ
- (NSDictionary *) dictionaryRepresentation. Используя этот метод для стандартных пользовательских значений по умолчанию, вы можете получить список всех ключей в пользовательских значениях по умолчанию. Затем вы можете использовать это, чтобы очистить пользовательские значения по умолчанию:- (void)resetDefaults { NSUserDefaults * defs = [NSUserDefaults standardUserDefaults]; NSDictionary * dict = [defs dictionaryRepresentation]; for (id key in dict) { [defs removeObjectForKey:key]; } [defs synchronize]; }
короткий способ сделать это с теми же результатами как в верхнем ответе Алекса Никола:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; [[NSUserDefaults standardUserDefaults] synchronize];
один лайнер
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Простое Решение
Цель C:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];на Swift 3.0:
if let appDomain = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: appDomain) }
Swift версия:
if let bid = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid) }
+ (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деятельность, и диск и копии памяти значений по умолчанию потребителя будут не содержит ни одного из значений, заданных приложением.
для тех из вас, кто хочет сделать это в тестовой цели, используйте это (как
removePersistentDomainне работает в этом случае)Swift 3:
for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) { UserDefaults.standard.removeObject(forKey: key) }
Oneliner в Swift:
Swift 3
NSUserDefaults.standardUserDefaults().removePersistentDomainForName( NSBundle.mainBundle().bundleIdentifier!)Swift 4
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Для Swift 3:
let appDomain = Bundle.main.bundleIdentifier! UserDefaults.standard.removePersistentDomain(forName: appDomain)
Для Swift 3:
if let bundle = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: bundle) }
Swift
func resetUserDefaults(){ let userDefaults = NSUserDefaults.standardUserDefaults() let dict = userDefaults.dictionaryRepresentation() as NSDictionary for key in dict.allKeys { userDefaults.removeObjectForKey(key as! String) } userDefaults.synchronize() }
этот метод не делает этого:
+ (void)resetStandardUserDefaultsиз документации
NSUserDefaults:resetStandardUserDefaults
синхронизирует любые изменения, внесенные в общий пользовательский объект по умолчанию и освобождает его из памяти.
+ (void)resetStandardUserDefaultsОбсуждение
при последующем вызове standardUserDefaults создается новый общий ресурс объект по умолчанию пользователя с помощью стандартный список поиска.
исходя из этого, можно сделать:
[NSUserDefaults resetStandardUserDefaults]; [NSUserDefaults standardUserDefaults];и теперь значения по умолчанию должны быть сброшены.
Swift 3 или 4 Мы можем даже упростить описанный фрагмент в это современное выражение:
func clearAll() { let settingsDictionary = userDefaults.dictionaryRepresentation() settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) } userDefaults.synchronize() }
Свифт
место в твоей логикеif let appDomain = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: appDomain) }
Comments