Хранение NSObject с использованием NSKeyedArchiver / NSKeyedUnarchiver - PullRequest
0 голосов
/ 29 марта 2011

У меня есть объект класса, как;

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

и я присваиваю некоторые значения этому классу,

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

поэтому я хочу сохранить этот класс с помощью NSKeyedArchiver и восстановить с помощью NSKeyedUnarchiver.

Я пишу в файл, но когда я получаю этот файл, сущность имеет любое значение.

Каков наилучший способ сделать это?

Спасибо.

1 Ответ

2 голосов
/ 29 марта 2011

Вы используете протокол NSCoding неправильно. Вы не должны архивировать сам объект, вы должны архивировать свойства вашего объекта и затем разархивировать их впоследствии. Вот как бы вы это сделали:

- (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;
}
...