2011-10-26 15 views
6

के उप-वर्ग पर एनएससीओडी का उपयोग करना मैं डेटा निरंतरता के तरीके के रूप में एक कस्टम क्लास को संग्रह/अनारक्षित करने के लिए एनएससीओडी का उपयोग कर रहा हूं। यह ठीक काम करता है अगर ऑब्जेक्ट NSObject का उप-वर्ग है, लेकिन मेरे पास ऑब्जेक्ट्स भी हैं जो कस्टम ऑब्जेक्ट्स के उप-वर्ग हैं। क्या मुझे initWithCoder को बदलने की आवश्यकता है: विधि के साथ ही encodeWithCoder? अभी, गुण जो उपclass एन्कोड/डीकोड ठीक के लिए विशिष्ट हैं, लेकिन सुपरक्लास से उत्तराधिकारी उत्तराधिकारी गुण नहीं है। कोई विचार?कस्टम वर्ग

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

उत्तर

11

File के initWithCoder: विधि अंदर

if ((self = [super init])) 

होना चाहिए

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

मेरे पास है, लेकिन एक सही का निशान अतः give..and में NSCoding तरीकों में से सुपर क्लास कार्यान्वयन कह रहा है कि तुम्हारा पुराना है। धन्यवाद। –

4

आप बुलाना चाहिए यहाँ बुनियादी संरचना हैअपने उपवर्ग

- (id)initWithCoder:(NSCoder *)coder { 
    if ((self = [super initWithCoder:coder])) 
    { 
     self.fileSizeString = [coder decodeObjectForKey:kFileSizeStringKey]; 
    } 
    return self; 
} 
संबंधित मुद्दे