2013-05-31 2 views
9

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

Я смог воспроизвести эту проблему. [NSUserDefaults synchronize] : вызов, но когда я перезапущу приложение после перезагрузки, значение внутри 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. 

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

+0

Какое событие вы используете для вызова '[NSUserDefaults synchronize]' –

+0

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

+0

Звучит странно, не должно случиться. Можете ли вы отправить код, в котором вы синхронизированы. – Shantanu

ответ

2

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

+1

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

+0

в вашем примере кода у него есть одна ссылка, но я сказал, что у вас может быть другой класс, который мог бы иметь такую ​​же ссылку, как и soo, если бы у вас была ссылка на стандартный ссылочный объект standarduserdefault, который obj равен нулю, а затем использовать .. и в случае, если u не используют userdefault где-то в другом месте, тогда вам нужно посмотреть, что именно вы делаете –

+1

Благодарим вас за изучение проблемы, но проблема даже проявляется в примере кода, который имеет только одну ссылку, поэтому, очевидно, проблема не имеет ничего общего с имеющих несколько ссылок. –

0

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

+1

В приведенном выше примере кода, который показывает проблему, ключ точно такой же. –

Смежные вопросы