2011-10-26 39 views
6

Tôi đang sử dụng NSCoding để lưu trữ/hủy lưu trữ một lớp tùy chỉnh làm phương thức lưu giữ dữ liệu. Nó hoạt động tốt nếu đối tượng là một lớp con của NSObject, nhưng tôi cũng có các đối tượng là các lớp con của các đối tượng tùy chỉnh. Tôi có cần thay đổi phương thức initWithCoder: cũng như encodeWithCoder không? Ngay bây giờ, các thuộc tính dành riêng cho lớp con mã hóa/giải mã tiền phạt, nhưng các thuộc tính mà lớp con kế thừa từ lớp cha thì không. Có suy nghĩ gì không? Dưới đây là cấu trúc cơ bản:Sử dụng NSCoding trên lớp con của lớp tùy chỉnh

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

và lớp con:

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

Trả lời

11

Bên initWithCoder: phương pháp 's File

if ((self = [super init])) 

nên

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

tôi có nhưng một dấu kiểm để cung cấp..và SO cho tôi biết bạn là người cũ. cảm ơn. –

4

Bạn nên gọi các việc triển khai siêu lớp của các phương thức NSCoding trong lớp con của bạn

- (id)initWithCoder:(NSCoder *)coder { 
    if ((self = [super initWithCoder:coder])) 
    { 
     self.fileSizeString = [coder decodeObjectForKey:kFileSizeStringKey]; 
    } 
    return self; 
} 
Các vấn đề liên quan