Очистка NSUserDefaults - PullRequest
       29

Очистка NSUserDefaults

281 голосов
/ 13 февраля 2009

Я использую +[NSUserDefaults standardUserDefaults] для хранения настроек приложения. Это состоит примерно из десятка строковых значений. Можно ли удалить эти значения навсегда, вместо того, чтобы просто установить для них значение по умолчанию?

Ответы [ 15 ]

506 голосов
/ 26 июля 2011

Вы можете удалить постоянный домен приложения следующим образом:

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

В Swift 3 и более поздних версиях:

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

Это похоже на ответ @samvermette, но немного чище IMO.

102 голосов
/ 10 июня 2010

Этот код сбрасывает настройки по умолчанию для домена регистрации:

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

Другими словами, это removeObjectForKey для каждого ключа, который вы когда-либо регистрировали в этом приложении.

Кредиты Кену Томассу на форумах Apple для разработчиков тема.

96 голосов
/ 13 февраля 2009

Вы пытались использовать - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
30 голосов
/ 15 апреля 2015

Вот ответ в Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
28 голосов
/ 06 сентября 2011

Если вам это нужно во время разработки, вы также можете сбросить симулятор, удалив все NSUserDefaults.

Симулятор iOS -> Сбросить содержимое и настройки ...

Имейте в виду, что он также удалит все приложения и файлы на симуляторе.

14 голосов
/ 20 января 2014
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
7 голосов
/ 18 августа 2016

В Свифт:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
5 голосов
/ 23 августа 2016

Я люблю расширения, когда они делают код чище:

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

        self.removePersistentDomainForName(domainName)
    }
}
5 голосов
/ 11 августа 2015

Примечание. Этот ответ также был обновлен для Swift.

Как насчет того, чтобы он был в одной строке?

Расширение ответа @Christopher Rogers - принято.

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

и да, иногда вам может понадобиться synchronize,

[[NSUserDefaults standardUserDefaults] synchronize];

Я создал метод для этого,

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

Swift

С swift это еще проще.

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

И использование :

UserDefaults.clean()
5 голосов
/ 04 декабря 2014

Я нашел это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...