Storing NSObject using NSKeyedArchiver/ NSKeyedUna

2020-08-04 10:50发布

问题:

I have a class object like;

BookEntity.h

    import <Cocoa/Cocoa.h>

    @interface BookEntity : NSObject<NSCoding> {

        NSString *name;
        NSString *surname;
        NSString *email;
    }
@property(copy) NSString *name,*surname,*email;
@end

BookEntity.m

#import "BookEntity.h"


@implementation BookEntity
@synthesize name,surname,email;
- (void) encodeWithCoder: (NSCoder *)coder
{

    [coder encodeObject: self forKey:@"appEntity"];

}   
- (id) initWithCoder: (NSCoder *)coder
{
    if (self = [super init])
    {

        self = [coder decodeObjectForKey:@"appEntity"];

    }
    return self;
}

and I assign some values to this class,

BookEntity *entity = [[BookEntity alloc] init];
entity.name = @"Stewie";
entity.surname = @"Griffin";
entity.email = @"sg@example.com";

so I want to store this class using NSKeyedArchiver and restore with NSKeyedUnarchiver.

I write to file but when I retrieve this file the entity has any value.

What is the best way to do this?

Thanks.

回答1:

Your use of the NSCoding protocol is incorrect. You shouldn't be archiving the object itself, you should be archiving the properties of your object and then unarchiving them afterwards. This is how you would do it:

- (void) encodeWithCoder: (NSCoder *)coder
{
    [coder encodeObject:self.name forKey:@"name"];
    [coder encodeObject:self.surname forKey:@"surname"];
    [coder encodeObject:self.email forKey:@"email"];
}   
- (id) initWithCoder: (NSCoder *)coder
{
    if (self = [super init])
    {
        self.name = [coder decodeObjectForKey:@"name"];
        self.surname = [coder decodeObjectForKey:@"surname"];
        self.email = [coder decodeObjectForKey:@"email"];
    }
    return self;
}