У меня есть приложение, которое использует [NSUserDefaults standardUserDefaults] для хранения информации о сеансе. Как правило, эта информация проверяется при запуске приложения и обновляется при выходе приложения. Я обнаружил, что, похоже, он работает ненадежно в iOS 8.
В настоящее время я тестирую iPad 2, хотя, если нужно, я могу протестировать другие устройства.
Некоторое время данные, записанные перед выходом, не будут сохраняться при запуске приложения. В то же время ключи, удаленные до выхода, иногда появляются после запуска.
Я написал следующий пример, чтобы попытаться проиллюстрировать проблему:
- (void)viewDidLoad
{
[super viewDidLoad];
NSData *_dataArchive = [[NSUserDefaults standardUserDefaults]
objectForKey:@"Session"];
NSLog(@"Value at launch - %@", _dataArchive);
NSString *testString = @"TESTSTRING";
[[NSUserDefaults standardUserDefaults] setObject:testString
forKey:@"Session"];
[[NSUserDefaults standardUserDefaults] synchronize];
_dataArchive = [[NSUserDefaults standardUserDefaults]
objectForKey:@"Session"];
NSLog(@"Value after adding data - %@", _dataArchive);
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"Session"];
[[NSUserDefaults standardUserDefaults] synchronize];
_dataArchive = [[NSUserDefaults standardUserDefaults]
objectForKey:@"Session"];
NSLog(@"Value before exit - %@", _dataArchive);
exit(0);
}
Запустив вышеприведенный код, я (обычно) получаю вывод ниже (что и следовало ожидать):
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - (null)
Если я затем закомментирую строки, которые удаляют ключ:
//[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"Session"];
//[[NSUserDefaults standardUserDefaults] synchronize];
И запустите приложение три раза, я бы ожидал увидеть:
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - TESTSTRING
Value at launch - TESTSTRING
Value after adding data - TESTSTRING
Value before exit - TESTSTRING
Value at launch - TESTSTRING
Value after adding data - TESTSTRING
Value before exit - TESTSTRING
Но на самом деле я вижу:
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - TESTSTRING
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - TESTSTRING
Value at launch - (null)
Value after adding data - TESTSTRING
Value after deleting data - TESTSTRING
например. Кажется, что не нужно обновлять значение при выходе из приложения.
EDIT. Я тестировал один и тот же код на iPad 2 под управлением iOS 7.1.2; и он, кажется, работает правильно каждый раз.
TL;DR. В iOS 8 работает [NSUserDefaults standardUserDefaults] неудовлетворительно? И если это так обходное решение/решение?