iOS 10 с XCode 8 GM приводил к тому, что NSUserDefaults периодически не работает

НОТА: Я видел много других сообщений о переполнении стека оNSUserDefaults переименовывается вUserDefaults в Swift или не работает на симуляторе до перезагрузки. Это не дубликат в любом случае. Многие из вопросов, с которыми сталкивается SO, были заданы 4 года назад. Мой вопрос относится к iOS 10 этого года, так как он всегда работал в старых версиях. Я уже упоминал в своем вопросе, что мой вопрос не является дубликатом этих вопросов, так как это были ошибки симулятора в swift, и моя проблема связана с ошибкой цели устройства C.Пожалуйста, прочитайте вопросы, прежде чем отмечать как дубликат

Моя проблема другая, так как я могу воспроизвести это на цели C и на самом физическом устройстве.

Для этого теста я создал новый проект с нуля. Я поместил этот код вviewDidLoad контроллера представления:

if (![[NSUserDefaults standardUserDefaults] valueForKey:@"checkIfInitialized"]){
    NSLog(@"setting checkIfInitialized as not exist");
    [[NSUserDefaults standardUserDefaults] setValue:@"test" forKey:@"checkIfInitialized"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    self.view.backgroundColor=[UIColor redColor];
    self.mylabel.text=@"NSUserDefaults was NOT there, try running again";
} else {
    NSLog(@"checkIfInitialized exists already");
    self.view.backgroundColor=[UIColor blueColor];
    self.mylabel.text=@"NSUserDefaults was already there this time, try running again";
}

Теперь, если я запускаю приложение около 10 раз, несколько раз оно находитcheckIfInitialized а иногда это не так. Нет точного числа, сколько раз он выходит из строя, поскольку он может работать 3 раза, затем отказывать в следующих 2 раза, затем работать 4 раза и один раз и так далее.

Теперь кое-что, что я заметил (хотя не уверен на 100%), что проблема, кажется, возникает, только когда я тестирую соединение через XCode. Если я запустил, запустив приложение, щелкнув значок приложения на устройстве без Xcode, то оно, кажется, работает нормально, но я не могу быть уверен на 100%.

Я заметил эту ошибку иногда:

[User Defaults] Failed to write value for key checkIfInitialized in CFPrefsPlistSource<0x1700f7200> (Domain: com.xxxx.appname, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)): Path not accessible, switching to read-only

У меня есть очень простой проект на моем Dropbox, если вы хотите проверить его. Я бы посоветовал протестировать около 10-15 раз, чтобы воспроизвести эту проблему.

https://www.dropbox.com/s/j7vbgl6e15s57ix/nsuserdefaultbug.zip?dl=0

Это прекрасно работает на iOS 9, так что определенно что-то делать с iOS 10.

РЕДАКТИРОВАТЬ Ошибка зарегистрировано: 28287988

Ответ команды Apple DTS:

Во-первых, вы должны сначала определить, происходит ли сбой standardUserDefaults или valueForKey. Я предполагаю, что «standardUserDefaults» возвращает NULL, и, если это так, то это то, от чего вы должны защищаться в целом. В частности, standardUserDefaults вернет NULL, если файл предпочтений зашифрован в среде, в которой в данный момент выполняется приложение (например, для предпочтения установлено значение «NSFileProtectionComplete», а приложение работает в фоновом режиме). Это не должно быть проблемой для стандартных приложений, предназначенных только для переднего плана, но об этом нужно знать в любом случае.

Весьма вероятно, что Xcode действительно вызывает здесь проблему. XCode значительно усложняет среду запуска приложений, что ОЧЕНЬ отличается от стандартного запуска приложений. Я предполагаю, что это в основном вызвано синхронизацией XCode, вызывая ожидаемую ситуацию во время запуска приложения, но если вы хотите более формальный тест этого, попробуйте установить единственную точку останова в applicationDidFinishLaunching и продолжить в отладчике, как только вы нажмете на него , Мое предположение - просто добавление, которое нарушает сроки, достаточные для предотвращения возникновения проблемы. Вроде, как бы, что-то вроде. Это iOS 10 только в том смысле, что iOS 9 никогда не будет печатать это сообщение журнала, но это потому, что сообщение журнала было добавлено в iOS 10. Сам код достаточно похож на iOS 9.3, что я подозреваю, точно такое же поведение (по крайней мере, в теория) возможно в iOS 9.

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

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