Объекты NSUserDefaults standardUserDefaults удаляются случайным образом

#ios #objective-c #ios7 #nsuserdefaults

#iOS #objective-c #ios7 #nsuserdefaults

Вопрос:

Я сталкиваюсь с очень странным поведением для NSUserDefaults, проблема в том, что объекты [NSUserDefaults standardUserDefaults] удаляются случайным образом!

Мой [NSUserDefaults standardUserDefaults] содержит около 65 объектов (60 небольших NSStrings и 3 массива, максимальное количество которых может составлять 4, и 2 других массива с максимальным количеством 30. обратите внимание, что это никогда не было максимальным случаем при решении этой проблемы), один из этих объектов является значением, проверяющим, завершил ли пользователь фазу регистрации. При запуске приложения иногда это NSUserDefaults будет содержать только 5 объектов из этих 65, а остальные удаляются из списка, не появляясь снова, даже если я перезапущу приложение., что снова приводит пользователя к этапу регистрации!!

я почти уверен, что правильно использую функцию сохранения

[[NSUserDefaults standardUserDefaults] setObject:@"Value" forKey:@"Key"];
[[NSUserDefaults standardUserDefaults] synchronize];

я искал в Google аналогичное поведение, не найдя ничего, что могло бы помочь! Кто-нибудь сталкивался с таким поведением и каково решение для его исправления?

Спасибо за любую помощь

Комментарии:

1. вы пробовали setObject вместо setValue ? у вас есть дубликаты ключей? значения?

2. Извините, я обновил свой пост .. я использую setObject во всех своих проектах, а не setValue .. я пробовал setValue в некоторых, но все еще безуспешно. Что вы подразумеваете под дублирующимися ключами? всякий раз, когда мои значения обновляются, я снова сохраняю их под тем же именем ключа!

3. при проверке списка в обычном режиме все поля успешно сохраняются без каких-либо дубликатов

4. можете ли вы распечатать содержимое nsuserdefaults после каждого сохранения ключа?

5. Все они успешно сохранены, потому что эти значения используются внутри приложения путем считывания их из NSUserDefault и отображаются нормально .. но когда я выхожу из приложения и снова открываю его через некоторое время, все эти значения удаляются (случайным образом и не всегда).. Кроме того, странно то, что объекты, связанные с фазой регистрации, не изменяются, когда пользователь открывает приложение и уже зарегистрировался ранее, так почему эти значения удаляются? я проверил, что нет ограничений на сохранение NSUserDefault, если пользователь имеет space..so эта ошибка сводит меня с ума: S

Ответ №1:

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

Так что потерпите, с моим проектом случилось вот что: у меня был одноэлементный класс, который инкапсулирует несколько свойств, и у меня были переопределенные установщики и получатели для этих свойств. В методе setter я получаю экземпляр standardUserDefaults и устанавливаю объект для ключа и синхронизирую. В методе получения я возвращаю объект ключа. Также у меня есть значение индикатора успешного входа в систему, чтобы указать, был ли вход в систему успешным. И так же, как и ваша проблема, мои объекты исчезают. После нескольких дней борьбы выясняется, что индикатор входа в систему был инициализирован на false, когда сеть стала недоступной. И в предложении indicator false я устанавливал для объектов nil значения по умолчанию для пользователя.

Мои замечания:

  • Дважды проверьте, являются ли вызовы standardUserDefaults setObject:forKey: function логически правильными, убедитесь, что объекты НЕ равны нулю при вызове
  • Проверьте, есть ли у вас логика (вход в систему, изменение сети и т.д.), Которая делает объекты недействительными.
  • Запустите тесты, найдите минимальные шаги для повторения проблемы. Используйте сеанс отладки для проверки объектов. (Перестаньте верить в случайное исчезновение)

Надеюсь, это даст зацепку.

Комментарии:

1. Также просто хочу отметить, что я использовал брелок для сохранения логинов в конце.

2. привет @vladof .. Ценю вашу помощь 🙂 Мои объекты никогда не равны нулю при установке объекта в NSUserDefault (я проверял каждое сохранение в nsuserdefault), я не понял 2-й пункт, но мое приложение всегда подключено к одной и той же сети, поскольку мое соединение никогда не теряется .. наконец, я попытался сделать невозможное, чтобы попытаться выяснить, как воспроизвести проблему .. я делаю то же самое десятки раз, и тот, который следует с теми же шагами, вызывает удаление объектов, вот почему я вызвал его случайным образом .. я все еще застрял без какого-либо прогресса об этом вопросе!

3. Конечно. Есть несколько методов, которые вы можете попробовать, сначала я бы написал код для выхода из канонического списка всех объектов и синхронизации в пользовательских ошибках каждые полсекунды или около того, сохраните файл журнала в каталоге документов, просмотрите журнал после возникновения ошибки. Во-вторых, почему бы не найти сотрудника и не объяснить ему код, иногда я узнаю, где я ошибаюсь, объясняя другим. Итак, я знаю, что вы думаете, что установка нулевых объектов не происходит, но я все еще в затруднении. Маловероятно, что это ошибка UserDefaults, и в 99% случаев это проблема нашего кода. Выбор хороших тестовых примеров действительно является ключом к помощи.