2011-10-26 11 views
6

Sto utilizzando NSCoding per archiviare/annullare l'archiviazione di una classe personalizzata come metodo di persistenza dei dati. Funziona bene se l'oggetto è una sottoclasse di NSObject, ma ho anche oggetti che sono sottoclassi di oggetti personalizzati. Devo cambiare initWithCoder: metodo e encodeWithCoder? In questo momento, le proprietà specifiche della sottoclasse codificano/decodificano bene, ma le proprietà della sottoclasse ereditate dalla superclasse non lo fanno. qualche idea? Qui è la struttura di base:Utilizzo di NSCoding in una sottoclasse di classe personalizzata

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

e la sottoclasse:

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

risposta

11

All'interno metodo s' il FileinitWithCoder:

if ((self = [super init])) 

dovrebbe essere

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

Ho solo un segno di spunta da dare..e SO mi sta dicendo che il tuo è più vecchio. Grazie. –

4

Si dovrebbe chiamare il implementazione superclasse dei metodi NSCoding nella sottoclasse

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