Синхронизация NSUserDefaults без сохранения на

У меня есть ошибка, представленная тестером, что если он выполняет действие, а затем перезагружает свой телефон (нажав несколько секунд кнопку «Домой» и «Режим сна / Пробуждение»), приложение не сохраняется.

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

Кто-нибудь знает, синхронизировать ли хранилища с буфером, который позже сохраняется на диск? Если да, то как мне очистить буфер (я думал, что синхронизация была такой же, как очистка, но, видимо, нет.)

(редактировать) Другими словами:

assert([[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO);
[[NSUserDefaults standardUserDefaults] setBool: YES forKey: MY_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];

оставьте приложение на переднем плане и перезагрузите устройство после вызова вышеуказанного, затем снова запустите устройство и снова запустите приложение. Утверждение должно срабатывать во второй раз, но иногда это не такт.

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

#define MY_KEY @"MY_KEY"

- (void)viewDidLoad
{
    [super viewDidLoad];
    BOOL key = [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY];
    NSLog(@"[[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == %@", key ? @"YES" : @"NO");
    [[NSUserDefaults standardUserDefaults] setBool: !key forKey: MY_KEY];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSLog(@"reboot now.");
}

Вот результат трех запусков приложения:

2013-05-31 12:17:44.127 syncTest[162:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == YES
2013-05-31 12:17:44.133 syncTest[162:907] reboot now.
2013-05-31 12:18:49.771 syncTest[128:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO
2013-05-31 12:18:49.778 syncTest[128:907] reboot now.
2013-05-31 12:19:41.388 syncTest[124:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO
2013-05-31 12:19:41.397 syncTest[124:907] reboot now.

Обратите внимание, что вывод былДА, НЕТ, НЕТ " но это должно было бытьДА, НЕТ, ДА "

 Shantanu Phate31 мая 2013 г., 17:54
Звучит странно, не должно произойти. Можете ли вы опубликовать код, где вы синхронизируете.
 Daniel T.02 нояб. 2013 г., 20:41
У меня нетЯ ничего не слышал от Apple об этом. Я работал над этим, сохраняя данные в объекте CoreData.
 Daniel T.31 мая 2013 г., 18:46
Я отправил отчет об ошибке в Apple: идентификатор ошибки # 14034591.
 sash08 нояб. 2013 г., 16:48
У меня та же проблема.
 Glen T01 нояб. 2013 г., 17:18
@DanielT. Вы когда-нибудь доходили до сути этого? Я'Я вижу похожую проблему.
 Ric Perrott31 мая 2013 г., 17:47
Какое событие вы используете для вызова[NSUserDefaults synchronize]
 Ben Packard18 янв. 2015 г., 15:27
Я вижу то же самое на iOS8. Кажется, есть временная составляющая. Если я подожду несколько секунд перед повторным запуском, синхронизация, похоже, сохранит новое значение. Если я перезагружаюсь в первую секунду или две, значение не обновляется.
 Daniel T.09 нояб. 2013 г., 19:47
Я отправил сообщение об ошибке 31 мая 2013 года. Apple запросила образец кода 3 июня 2013 года, и я отправил образец кода в тот же день. У них нетс тех пор ответил. Даже не подтверждение.
 Mike D31 мая 2013 г., 17:58
Где разместили ваш звонок?[NSUserDefaults synchronize]
 wattson1231 мая 2013 г., 17:48
Синхронизация должна работать, может помочь увидеть некоторый код. как вы устанавливаете и выбираете данные?

Ответы на вопрос(2)

и я идентифицировал, что у меня было две ссылки на объект [NSUserDefaults standardUserDefaults] на разные классы, потому что nsdefault является одноэлементным классом, так что тот, который был вызван ранее, будет иметь его, если у вас уже могла быть ссылка на[NSUserDefaults standardUserDefaults] попытайтесь завершить его из первой ссылки и дайте экземпляру освободиться оттуда, а затем вызовите экземпляр в другом классе и выполните синхронизацию, надеюсь, будет выполнено

 Khurram Iqbal27 февр. 2014 г., 16:45
в вашем примере кода он имеет одну ссылку, но я сказал вам, что у вас может быть другой класс, который может иметь такую же ссылку, так что, если у вас есть ссылка на набор ссылок на объект standarduserdefault, который obj равен nil, а затем используется .. и в случае, если вы Вы не используете userdefault где-то еще, а затем должны увидеть, что именно вы делаете
 Daniel T.01 мар. 2014 г., 14:31
Спасибо за внимание к проблеме, но проблема даже проявляется в примере кода, который имеет только одну ссылку, поэтому очевидно, что проблема не имеет ничего общего с наличием нескольких ссылок.
 Daniel T.27 февр. 2014 г., 13:59
Вы заметите, что в моем примере кода только один класс имеет ссылку на NSUserDefaults. Так что это неТ ответить на вопрос. Если это сработало для вас, яЯ счастлив, хотя.

которые я написал в NSUserDefaults, сохранялись, а некоторые - нет. После долгих поисков я заметил, что у пары ключ-значение, которая не сохранилась, был ключ, который был преобразован в контуры, то есть TheKey против theKey. Когда я изменил свой ключ на ключ в верблюжьем корпусе (theKey вместо TheKey), значение сохранялось через выход из приложения и повторный запуск. Мне кажется очень странным, почему это так, но в моем случае это сработало.

 Daniel T.17 мар. 2014 г., 21:48
В приведенном выше примере кода, который демонстрирует проблему, ключ точно такой же.

Ваш ответ на вопрос