简体   繁体   中英

NSCoding: Custom Class unarchived, but with empty/nil class members

I want to persist an NSDictionary, filled with custom Object to disc:

     NSDictionary *menuList = [[NSMutableDictionary alloc]initWithDictionary:xmlParser.items];
     //here the "Menu List"`s Object are filled correctly

     //persisting them to disc:
     NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
     NSString *directory = [paths objectAtIndex:0];
     NSString *fileName = [NSString stringWithUTF8String:MENU_LIST_NAME];
     NSString *filePath = [directory stringByAppendingPathComponent:fileName];

     //saving using NSKeyedArchiver
     NSData* archiveData = [NSKeyedArchiver archivedDataWithRootObject:menuList];
     [archiveData writeToFile:filePath options:NSDataWritingAtomic error:nil];

     //here the NSDictionary has the correct amount of Objects, but the Objects` class members are partially empty or nil
     NSData *data = [NSData dataWithContentsOfFile:filePath];
     NSDictionary *theMenu = (NSDictionary*)[NSKeyedUnarchiver unarchiveObjectWithData:data];

Here the .m of the Custom Object (the kind of object stored in the NSDictionary)

- (id)initWithTitle:(NSString*)tTitle level:(NSString*)tLevel state:(NSString*)tState visible:(BOOL)tVisible link:(NSString*)tLink linkType:(NSString*)tLinkType anId:(NSString*)tId {
if ((self = [super init])) {
    self.anId = tId;
    self.title = tTitle;
    self.level = tLevel;
    self.state = tState;
    self.visible = tVisible;
    self.link = tLink;
    self.linkType = tLinkType;
 }
 return self;
 }


 - (void) encodeWithCoder:(NSCoder *)encoder {
 [encoder encodeObject:self.anId forKey:@"anId"];
 [encoder encodeObject:self.level forKey:@"level"];
 [encoder encodeObject:self.state forKey:@"state"];
 [encoder encodeBool:self.visible forKey:@"visible"];
 [encoder encodeObject:self.title forKey:@"title"];
 [encoder encodeObject:self.link forKey:@"link"];
 [encoder encodeObject:self.linkType forKey:@"linkType"];
 }

 - (id)initWithCoder:(NSCoder *)decoder {

 if(self == [super init]){
    self.anId = [decoder decodeObjectForKey:@"anId"];
    self.level = [decoder decodeObjectForKey:@"level"];
    self.state = [decoder decodeObjectForKey:@"state"];
    self.visible = [decoder decodeBoolForKey:@"visible"];
    self.title = [decoder decodeObjectForKey:@"title"];
    self.link = [decoder decodeObjectForKey:@"link"];
    self.linkType = [decoder decodeObjectForKey:@"linkType"];

}

return self;
 }
 @end

I dont know why the objects are unarchived correctly, but the object´s members are lost somewhere. I assume there must be an error somewhere in the NSCoding methods, but I just can´t find it, any help much appreciated.

When you implement the initWithCoder: method, you need to call super properly:

if (self = [super initWithCoder:decoder]) {

The instance that is being unarchived has more attributes than just the additions in your specific class. You also don't want to be checking equality with self , you want to be assigning to self .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM