Ошибка NSKeyedUnarchiver после переименования проекта Xcode

Я только что переименовал свой проект Xcode, и когда я запустил его, я получил эту ошибку:

2015-11-14 05:32:42.337 Buck Tracker[3537:1456100] * Завершение работы приложения из-за неперехваченного исключения "NSInvalidUnarchiveOperationException", причина: "* -[NSKeyedUnarchiver decodeObjectForKey:]: невозможно декодировать объект класс (iBudgeter.Record) для ключа (NS.objects); класс может быть определен в исходном коде или в несвязанной библиотеке.

Buck Tracker — это новое имя, а iBudgeter — исходное имя. Record — это пользовательское NSObject, которое я создал для хранения некоторых данных.

Я попытался переименовать проект обратно в iBudgeter, но это не сработало. Возврат к предыдущей версии в git помог, но я получил ту же ошибку, когда снова переименовал ее.

Итак, какие-либо предложения?


person hklel    schedule 13.11.2015    source источник
comment
Соответствует ли Buck Tracker протоколу NSCoding?   -  person JAL    schedule 14.11.2015
comment
вы пробовали делать "чистку"?   -  person nsinvocation    schedule 14.11.2015
comment
@hal9000 Я сделал, но это не сработало   -  person hklel    schedule 14.11.2015
comment
@JAL Что мне делать, чтобы соответствовать NSCoding?   -  person hklel    schedule 14.11.2015
comment
У вас есть существующие пользователи с сохраненными данными, к которым вы хотите сохранить доступ?   -  person rob mayoff    schedule 14.11.2015
comment
@robmayoff Да, на самом деле сброс симулятора работает, но это приложение уже есть в App Store, поэтому я не могу этого сделать.   -  person hklel    schedule 14.11.2015


Ответы (6)


Не меняйте название вашего проекта. Просто измените отображаемое имя. Это запись «Отображаемое имя пакета» в вашем Info.plist. Вероятно, вам потребуется добавить запись.

добавление отображаемого имени пакета в Info.plist

См. этот ответ, если вы хотите изменить отображаемое имя приложения OS X.

person rob mayoff    schedule 13.11.2015
comment
Вау, ты спасатель! Не знал, что я так умею :D - person hklel; 14.11.2015
comment
Как это сделать, если вы хотите изменить имя не только на отображаемое имя? - person dhruvm; 15.06.2016

другой способ - исправить имя класса, используемого для NSCoding. Вам просто нужно использовать:

  • NSKeyedArchiver.setClassName("Record", forClass: Record.self перед сериализацией
  • NSKeyedUnarchiver.setClass(Record.self, forClassName: "Record") перед десериализацией

везде, где нужно.

Похоже, в расширениях iOS перед именем класса стоит название расширения.

person teriiehina    schedule 11.05.2016

В случае, если вы переместили свой файл в другой модуль, вам нужно будет добавить дополнительную информацию

NSKeyedArchiver.setClassName("OldModule.ClassName", for: ClassName.self)
NSKeyedUnarchiver.setClass(ClassName.self, forClassName: "OldModule.ClassName")
person tt.Kilew    schedule 29.08.2017
comment
Это правильный ответ, когда модули изменились или цель была скопирована и т. д. Спасибо, чувак. - person Onur Şahindur; 24.10.2019

У меня была такая же ошибка после переименования ClassA, использующего протокол NSCoding, в ClassB.

Для меня проблема заключалась в том, что я использовал ClassA в своих UserDefaults. Таким образом, старое имя ClassA хранилось в .plist UserDefaults.

Когда приложение запускалось, оно пыталось прочитать .plist, и из-за несоответствия имен приложение вылетало.

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

Чтобы удалить значения по умолчанию, я использовал эту команду в терминале:

defaults delete buldle-identifier

person user1406622    schedule 28.10.2018

У меня была эта проблема прошлой ночью. Отсортировал его после 3 часов изучения, просто изменив «Имя продукта» (в разделе «Настройки сборки») на исходное значение.

person Charlie Seligman    schedule 30.01.2020

Просто удалите старое приложение и запустите его снова, у меня работает

person kamrul    schedule 09.09.2020