2011-10-26 3 views
6

J'utilise NSCoding pour archiver/désarchiver une classe personnalisée en tant que méthode de persistance des données. Cela fonctionne correctement si l'objet est une sous-classe de NSObject, mais j'ai également des objets qui sont des sous-classes d'objets personnalisés. Dois-je changer la méthode initWithCoder: ainsi que encoderCodeCoder? À l'heure actuelle, les propriétés spécifiques à la sous-classe codent/décodent correctement, mais les propriétés héritées de la sous-classe par la sous-classe ne le sont pas. Des pensées? Voici la structure de base:Utilisation de NSCoding sur une sous-classe de la classe personnalisée

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

et la sous-classe:

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

Répondre

11

Dans la méthode de initWithCoder:File

if ((self = [super init])) 

devrait être

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

Je n'ai qu'une seule coche à donner ... et SO me dit que la vôtre est plus ancienne. Merci. –

4

Vous devez appeler la implémentation de superclasse des méthodes NSCoding dans votre sous-classe

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