2011-10-26 11 views
6

Estoy usando NSCoding para archivar/desarchivar una clase personalizada como método de persistencia de datos. Funciona bien si el objeto es una subclase de NSObject, pero también tengo objetos que son subclases de objetos personalizados. ¿Debo cambiar el método initWithCoder así como encodeWithCoder? En este momento, las propiedades que son específicas de la subclase codifican/decodifican bien, pero las propiedades que la subclase hereda de la superclase no. ¿Alguna idea? Aquí está la estructura básica:Usando NSCoding en una subclase de clase personalizada

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

y la subclase:

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

Respuesta

11

Dentro initWithCoder: método de la File 's

if ((self = [super init])) 

debería ser

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

tengo solo una marca de verificación para dar ... y SO me dice que la suya es anterior. Gracias. –

4

Debe llamar el implementación de la superclase de los métodos NSCoding en su subclase

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