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».

Благодарим за любую идею!

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

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