Я надеюсь, что это не связано с тем, что я использую Mutable array здесь, но этот меня озадачивает, поэтому меня это не удивит, если бы это было так ,NSKeyedArchiver и NSKeyedUnarchiver с NSMutableArray
ФОН:
Я сделал небольшую базу данных, которая является по существу NSMutableArray, содержащий пользовательские объекты, которую мы можем назвать recordObjects. Я создал массив:
database = [[NSMutableArray alloc] init];
и мой пользовательский объект, называемый «recordObject» содержит следующие переменные и inits:
NSString *name;
int anInt;
Bool aBool;
Я также синтезируют методы, так что я могу совершать звонки, как:
aString = [[database objectAtIndex:someIndex] name];
И добавил методы к классу контроллера для добавления, удаления и выбора отдельных записей для отображения. Пока все работает правильно и точно так, как ожидалось.
Далее я создал свой recordObject класс (подкласс) NSObject использовать NSCoder (путем включения в директиве @interface, и добавлены следующие пользовательские кодер и декодер методов в файле реализации:
-(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"];
}
для того, чтобы написать файл, я использовал следующее:.
[NSKeyedArchiver archiveRootObject:database toFile:myPath];
при запуске программы, все ПОЯВЛЯЕТСЯ для корректной работы метод кодировщика вызывается для каждого из записей в массиве и файл записывается на диск. Открытие файла w Ith TextEdit показывает, что данные есть (хотя в основном непонятна мне.)
ПРОБЛЕМА:
Вот где я бегу в корягу.
Я добавил следующий код, чтобы загрузить файл в моем массиве базы данных:
database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath];
Когда я снова запустить программу, на этот раз Загрузка базы данных, он ПОЯВЛЯЕТСЯ работать правильно. Мой первый тест был использовать NSMutableArray метод подсчета:
x = [database count];
В результате, X заполняется с правильным количеством записей в файле. Если было сохранено 5 записей, когда я сохранил базу данных, X будет установлен на 5 после загрузки базы данных при следующем выполнении программы.
Теперь вот большая проблема:
Программа вылетает при попытке использовать любой из моих методов доступа.Например, если я пытаюсь использовать следующее после загрузки базы данных:
aString = [[database objectAtIndex:someIndex] name];
программные сбои и возвращает следующее сообщение об ошибке в консоли:
Program received signal: “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
Моя интерпретация является то, что данные не загружен и инициализирован в массив базы данных по какой-то причине, но для жизни я не могу понять, где я здесь ошибся.
В качестве примечания, все я реализовал пришел из книги Стивена Г. Кочан в «Программирование в Objective-C»
Любые идеи, было бы весьма признателен!
Не хватило бы -copy? Согласно документам, unarchiveObjectWithFile: «возвращает граф объектов, предварительно закодированный NSKeyedArchivier». В этом случае это был NSMutableArray. –
Нет, если вы вызываете 'copy' на' NSMutableArray', тогда вы получите неизменяемый 'NSArray'. К сожалению, здесь документы говорят только половину истории. То же самое происходит с 'NSCoder'. Если вы используете 'NSCoder' для кодирования' NSMutableString', то при его расшифровке вы вернете 'NSString'. Вы должны использовать 'mutableCopy', чтобы вернуть измененные версии. –
Неверный вопрос о архивировании изменяемых объектов. Архивирование и разблокирование изменяемого объекта, такого как 'NSMutableArray' или' NSMutableString', не делает его неизменным. –