Использование NSCoding для подкласса пользовательского класса - PullRequest
6 голосов
/ 26 октября 2011

Я использую NSCoding для архивации / разархивирования пользовательского класса в качестве метода сохранения данных.Это прекрасно работает, если объект является подклассом NSObject, но у меня также есть объекты, которые являются подклассами пользовательских объектов.Нужно ли изменить initWithCoder: метод, а также encodeWithCoder?Прямо сейчас, свойства, которые являются специфическими для подкласса, хорошо кодируют / декодируют, но свойства, которые наследует подкласс от суперкласса, нет.Какие-нибудь мысли?Вот основная структура:

@interface NewsItem : NSObject <NSCoding, NSCopying> {
//properties for the super class here
}

@implementation NewsItem
- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:itemName forKey:kItemNameKey];
//etc etc
}

- (id)initWithCoder:(NSCoder *)coder {
    if ( (self = [super init]) )
    {
        self.itemName = [coder decodeObjectForKey:kItemNameKey];
//etc etc
    }
    return self;
}

-(id)copyWithZone:(NSZone *)zone {
    NewsItem *copy = [[[self class] allocWithZone: zone] init];
    copy.itemName = [[self.itemName copy] autorelease];
//etc etc
    return copy;
}

и подкласс:

@interface File : NewsItem {
    NSString *fileSizeString;
//etc etc
}

@implementation File
- (void)encodeWithCoder:(NSCoder *)coder {
    [super encodeWithCoder:coder]; //added this, but didn't seem to make a difference
    [coder encodeObject:fileSizeString forKey:kFileSizeStringKey];
//etc etc

}

- (id)initWithCoder:(NSCoder *)coder {
    if ( (self = [super init]) )
    {
        self.fileSizeString = [coder decodeObjectForKey:kFileSizeStringKey];
//etc etc
    }
    return self;
}

-(id)copyWithZone:(NSZone *)zone {
    File *copy = (File *)[super copyWithZone:zone];
    copy.fileSizeString = [[self.fileSizeString copy] autorelease];
//etc etc
    return copy;
}

Ответы [ 2 ]

12 голосов
/ 26 октября 2011

Внутри File initWithCoder: метода

if ( (self = [super init]) )

должно быть

if ( (self = [super initWithCoder:coder]) )
4 голосов
/ 26 октября 2011

Вы должны вызвать реализацию суперкласса методов NSCoding в вашем подклассе

- (id)initWithCoder:(NSCoder *)coder {
    if ( (self = [super initWithCoder:coder]) )
    {
        self.fileSizeString = [coder decodeObjectForKey:kFileSizeStringKey];
    }
    return self;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...