Я хочу добавить протокол архивации (NSCoding) к моему классу модели, а затем я реализую оба метода: encodeWithCoder:(NSCoder*)coder
и initWithCoder:(NSCoder*)coder
. MyModelClass имеет 2 переменные экземпляра (NSString и NSImage), поэтому я использую метод encodeObject:(id)object forKey:(NSString*)string
для кодирования объекта и значения для конкретного ключа. Но я продолжаю получил ошибку:Вопрос протокола NSCoding
*** -encodeObject:forKey: only defined for abstract class. Define -[NSArchiver encodeObject:forKey:]!
вот мой код методов NSCoding:
- (id)initWithCoder:(NSCoder *)coder {
[super init];
mainPath = [[coder decodeObjectForKey:@"mainPath"] retain];
icon = [[coder decodeObjectForKey:@"icon"] retain];
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
NSLog(@"encode with coder is called");
[coder encodeObject:mainPath forKey:@"mainPath"];
[coder encodeObject:icon forKey:@"icon"];
}
И это, как я называю их в моем классе контроллера:
id object = [assetArray objectAtIndex: [[rows lastObject] intValue]];
if ([object isKindOfClass:[ItemAssetModel class]])
NSLog(@"object is correct");
else
return NO;
NSData *data = [NSArchiver archivedDataWithRootObject: object];
если я изменяю encodeObject:(id)obj forKey:(NSString*)str
с encodeObject:(id)obj
, ошибка останавливается, но в результате архивные данные не копируют переменную экземпляра значение (cmiiw). Я что-то пропустил?
спасибо. hebbian
Правильно, потому что вы используете методы кодирования/декодирования с ключом. –
Ах, так просто, спасибо – Hebbian
@Hebbian - Этот ответ решил мою проблему. Вы должны отметить его как правильный – 2011-12-21 21:30:18