2011-10-26 24 views
6

NSCoding'i, özel bir sınıfı bir veri kalıcılık yöntemi olarak arşivlemek/arşivden çıkarmak için kullanıyorum. Nesne NSObject'in bir alt sınıfıysa iyi çalışır, ancak özel nesnelerin alt sınıfları olan nesnelerim de vardır. IndeWithCoder: yönteminin yanı sıra encodeWithCoder öğesini değiştirmem gerekiyor mu? Şu anda, alt sınıflara özgü olan özellikler kodlamayı/kod çözmeyi güzelleştirir, ancak alt sınıfın üst sınıftan aldığı özellikler bunu yapmaz. Düşüncesi olan var mı? SenNSCoding'i özel sınıfın bir alt sınıfında kullanma

if ((self = [super initWithCoder:coder])) 

cevap

11

:

@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; 
} 

ve alt sınıf: İşte temel yapıdırAlt sınıfınızda NSCoding yöntemlerinin üst sınıf uygulaması

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

Vermek için bir işaretim var ... ve SO bana daha eski olduğunu söylüyor. Teşekkürler. –

4

çağırmalıdır

if ((self = [super init])) 

olmalıdır File 'ın initWithCoder: yöntemle İçinde

@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; 
} 
İlgili konular