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.
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;
}
来源:https://stackoverflow.com/questions/5475898/storing-nsobject-using-nskeyedarchiver-nskeyedunarchiver