NSKeyedArchiver и NSKeyedUnarchiver с NSMutableArray
Я надеюсь, что это не связано с тем фактом, что я здесь использую изменяемый массив, но это сбивает меня с толку, так что это не удивило бы меня, если бы это было так.
ФОН:
Я создал небольшую базу данных, которая, по сути, представляет собой NSMutableArray, содержащий пользовательские объекты, которые мы можем вызвать recordObjects. Я установил массив:
<code>database = [[NSMutableArray alloc] init]; </code>
и мой пользовательский объект с именем & quot; recordObject & quot; содержит следующие переменные и единицы:
<code>NSString *name; int anInt; Bool aBool; </code>
Я также синтезировал методы, чтобы я мог делать такие вызовы, как:
<code>aString = [[database objectAtIndex:someIndex] name]; </code>
И добавил методы в мой класс контроллера для добавления, удаления и выбора отдельных записей для отображения. Пока все работает правильно и именно так, как и ожидалось.
Затем я настроил свой класс recordObject (подкласс NSObject) для использования NSCoder (включив в него директиву @interface, и добавил следующие пользовательские методы кодировщика и декодера в файл реализации:
<code>-(void) encodeWithCoder: (NSCoder *) encoder { [encoder encodeObject: name forKey: @"recordName"]; [encoder encodeInt: anInt forKey: @"recordInteger"]; [encoder encodeBool: aBool forKey: @"recordBool"]; } -(id) initWithCoder: (NSCoder *) decoder { name = [decoder decodeObjectForKey: @"recordName"]; anInt = [decoder decodeIntForKey: @"recordInteger"]; aBool = [decoder decodeBoolForKey: @"recordBool"]; } </code>
Для записи файла я использовал следующее:
<code>[NSKeyedArchiver archiveRootObject:database toFile:myPath]; </code>
Когда я запускаю программу, кажется, что все работает правильно. Метод кодировщика вызывается для каждой записи в массиве, а файл записывается на диск. Открытие файла с помощью TextEdit показывает, что данные есть (хотя в большинстве случаев они мне непонятны).
ЭТА ПРОБЛЕМА:
Здесь я сталкиваюсь с препятствием.
Я добавил следующий код, чтобы ЗАГРУЗИТЬ файл в массив моей базы данных:
<code>database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath]; </code>
Когда я снова запускаю программу, на этот раз загружая базу данных, она, кажется, работает правильно. Моим первым тестом было использование метода подсчета NSMutableArray:
<code>x = [database count]; </code>
В результате X заполняется правильным количеством записей в файле. Если при сохранении базы данных было 5 записей, для X устанавливается значение 5 после загрузки базы данных при следующем запуске программы.
Теперь вот большая проблема:
Программа вылетает, если я пытаюсь использовать ЛЮБОЙ из моих методов доступа. Например, если я попытаюсь использовать следующее после загрузки базы данных:
<code>aString = [[database objectAtIndex:someIndex] name]; </code>
программа вылетает и возвращает в консоли следующую ошибку:
<code>Program received signal: “EXC_BAD_ACCESS”. sharedlibrary apply-load-rules all </code>
Моя интерпретация заключается в том, что по какой-то причине данные не загружаются и не инициализируются правильно в массиве базы данных, но я не могу понять, в чем здесь я ошибся.
В качестве дополнительного примечания все, что я реализовал, пришло из книги Стивена Кочана «Программирование в Objective-C».
Благодарим за любую идею!