Сегодня я узнаю, что iOS имеет энергозависимое и постоянное хранилище для UserDefaults
.
. Я регистрирую значение (value
) с ключом (key
), используя метод register
.
let key = "key"
let value = "value"
UserDefaults.standard.register(defaults: [key: value])
В своем коде приложения я пытаюсь удалить ключ, используя removeObject(forKey:) method
.
UserDefaults.standard.removeObject(forKey: key)
Я ожидаю, что в следующий раз, когда я попытаюсь получить значение key
, object(forKey:)
вернет nil
(но это не так).
Полный код:
let key = "key"
let value = "value"
UserDefaults.standard.register(defaults: [key: value])
UserDefaults.standard.setValue(value, forKey: key)
UserDefaults.standard.removeObject(forKey: key)
UserDefaults.standard.object(forKey: key) // "value" - why?
- Насколько я понимаю,
register
метод «регистрирует» значения в registrationDomain , который является временным, пока не будет установлено действительное значение (с использованием метода setValue(forKey:)
). Но в этом случае, даже если я установил реальное значение, а затем удалил значение, object(forKey:)
возвращает значение из registrationDomain
. Почему Apple решила сделать это таким образом? Я не могу придумать очевидного, почему, когда однажды явно запрашивает удаление значения, оно все равно должно возвращать значение, зарегистрированное с использованием метода register
? Это просто вопрос постоянных или нестабильных доменов? - Означает ли это, что после регистрации ключа с использованием метода
register
всегда ожидается, что он будет иметь значение?
Почему я не могу использовать removeVolatileDomain(forName:)
для очистки всего registrationDomain
?
let key = "key"
let value = "value"
UserDefaults.standard.register(defaults: [key: value])
// This doesn't work? registrationDomain = ["key": "value"]
UserDefaults.standard.removeVolatileDomain(forName: UserDefaults.registrationDomain)
// Why do I have to do this?
var registeredDefaults = UserDefaults.standard.volatileDomain(forName: UserDefaults.registrationDomain)
registeredDefaults[key] = nil
UserDefaults.standard.setVolatileDomain(registeredDefaults, forName: UserDefaults.registrationDomain)
// registrationDomain = [:]