Реализация NSKeyedUnarchiver unarchivedObjectOfClass выдает ошибку

#ios #nskeyedarchiver #nskeyedunarchiver #nssecurecoding

#iOS #nskeyedarchiver #nskeyedunarchiver #nssecurecoding

Вопрос:

Я обновляю старое приложение Objective C, которое использует ‘NSKeyedUnarchiver unarchiveObjectWithData’, которое теперь устарело. Приложение архивирует массив, состоящий из пользовательских объектов, которые содержат (среди прочего) другой массив другого пользовательского объекта. Я реализовал NSSecureCoding в файлах .h 2 объектов и добавил переопределение ‘ (BOOL) supportsSecureCoding’ в обоих файлах .m.

Мой обновленный код архивирования корректно работает со старым устаревшим методом NSKeyedUnarchiver unarchiveObjectWithData:

         NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.myArray
                                             requiringSecureCoding:YES
                                                             error:amp;error];
        BOOL success = [data writeToFile:pathToArchiveFile
                                 options:NSDataWritingAtomic
                                   error:amp;error];
  

Однако с моим обновленным кодом разархивирования я получаю сообщение об ошибке

         NSData *data = [NSData dataWithContentsOfFile: pathToArchiveFile
                                              options:NSDataReadingMappedIfSafe
                                                error:amp;error];
        self.myArray = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class]
                                                          fromData:data
                                                             error:amp;error];
  

Ошибка
..."value for key 'NS.objects' was of unexpected class 'MyClass... Allowed classes are '{( "NSArray...

Если я изменюсь на unarchivedObjectOfClass:[MyClass class] ошибку ..."value for key 'root' was of unexpected class 'NSArray...Allowed classes are '{( "MyClass...

Что-то идет не так с разархивированием массивов, содержащих пользовательские классы, но я не вижу, как это исправить, и доступная документация довольно слабая. Я предполагаю, что код архива правильный, поскольку устаревший метод unArchive, похоже, работает с ним корректно.

Комментарии:

1. Все еще борюсь с этим и надеюсь, что кто-то знает, как это работает