Сериализация объекта Cocoa Touch.Попытка чтения данных члена пользовательского класса после декодирования приводит к сбою программы - PullRequest
0 голосов
/ 19 июня 2011

При попытке закодировать и декодировать созданный мною объект возникает странная ошибка.Я считаю, что сделал объект и все содержащиеся в нем объекты соответствуют NSCoding и NSCopying.Я пытаюсь закодировать NSMutableArray, заполненный «Целями», которые имеют заголовок NSString и NSMutableArray «ActionSteps», которые также соответствуют протоколам.Я могу очень хорошо кодировать объекты, и когда я декодирую объекты, они отвечают на вызовы функций, которые не связаны с членами данных, но когда я пытаюсь прочитать заголовок одного из «Целей», программа вылетает, и я получаю этосообщение об ошибке:

- [__ NSArrayM isEqualToString:]: нераспознанный селектор, отправленный экземпляру, за которым следует трассировка стека и, наконец,: Программа получила сигнал: «SIGABRT».

Я получаю то же сообщение об ошибке, когдаЯ пытаюсь получить доступ к названиям «ActionSteps» внутри целей.

Вот мой код для класса "goal" для соответствия протоколам.

#pragma mark NSCoding
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:goalName forKey:GoalNameKey];
[encoder encodeObject:actionSteps forKey:ActionStepsKey];
}

На этот раз я попытался распечатать все, что возвращает декодер, как это должно быть NSString, и яполучил тот же сбой.

- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
    goalName = [[decoder decodeObjectForKey:GoalNameKey] retain];
    NSLog((NSString *)[decoder decodeObjectForKey:GoalNameKey]);
    actionSteps = [[decoder decodeObjectForKey:ActionStepsKey] retain];
}
return self;
}

#pragma mark -
#pragma mark NSCopying
- (id)copyWithZone:(NSZone *)zone {
Goal *copy = [[[self class] allocWithZone: zone] init];
copy.goalName = [[self.goalName copyWithZone:zone] autorelease];
copy.actionSteps = [[self.actionSteps copyWithZone:zone] autorelease];
return copy;
}

Вот код для кодирования основного NSMutableArray, который содержит все мои "цели":

[NSKeyedArchiver archiveRootObject:goalViewController.goals toFile:[self dataFilePath]];

и для декодирования:

NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
    goalViewController.goals = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
}
else {
    goalViewController.goals = [[NSMutableArray alloc]init];
}

ошибкапроисходит, когда я пытаюсь прочитать из заголовка «Цель» после того, как он был декодирован

label.text = self.goal.goalName;

1 Ответ

3 голосов
/ 19 июня 2011

У вас есть ActionStepsKey в обоих вызовах декодирования:

goalName = [[decoder decodeObjectForKey:ActionStepsKey] retain];
actionSteps = [[decoder decodeObjectForKey:ActionStepsKey] retain];

Первый должен иметь GoalNameKey:

goalName = [[decoder decodeObjectForKey:GoalNameKey] retain];
actionSteps = [[decoder decodeObjectForKey:ActionStepsKey] retain];
...