自定义对象的归档基本概念
自定义的对象要支持归档、需要实现 NSCoding 协议
NSCoding 协议有两个方法:
encodeWithCoder 方法对对象的属性数据做编码处理。
initWithCoder 解码归档数据来初始化对象。
实现 NSCoding 协议后,就能通过 NSKeyedArchiver 归档。
/**
* User.h 定义
*/
#import <Foundation/Foundation.h>
@interface User : NSObject <NSCoding>
@property(nonatomic, copy) NSString *name;
@property(nonatomic, copy) NSString *email;
@property(nonatomic, copy) NSString *password;
@property(nonatomic, assign) int age;
@end
/**
* User.h 实现
*/
#import "User.h"
#define AGE @"age"
#define NAME @"name"
#define EMAIL @"email"
#define PASSWORD @"password"
@implementation User
// 对属性编码,归档时调用
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInt:_age forKey:AGE];
[aCoder encodeObject:_name forKey:NAME];
[aCoder encodeObject:_email forKey:EMAIL];
[aCoder encodeObject:_password forKey:PASSWORD];
}
// 对属性解码, 解归档时调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self != NULL) {
_age = [aDecoder decodeIntForKey:AGE];
self.name = [aDecoder decodeObjectForKey:NAME];
self.email = [aDecoder decodeObjectForKey:EMAIL];
self.password = [aDecoder decodeObjectForKey:PASSWORD];
}
return self;
}
- (NSString *)description
{
NSString *str = [NSString stringWithFormat:@"age:%d, name:%@, email:%@, password:%@", _age, _name, _email, _password];
return str;
}
@end
/**
* main 函数实现
*/
#import <Foundation/Foundation.h>
#import "User.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
User *user = [[User alloc] init];
user.name = @"jackson";
user.age = 22;
user.email = @"123@sina.com";
user.password = @"123456";
// 归档
NSString *homePath = NSHomeDirectory();
NSString *path = [homePath stringByAppendingPathComponent:@"test.archive"];
BOOL sucess = [NSKeyedArchiver archiveRootObject:user toFile:path];
if (sucess)
{
NSLog(@"archive sucess");
}
// 解归档
User *user1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
// 会调用 User 类重写的 - (NSString *)description 方法输出 User 类的成员变量值
NSLog(@"%@", user1);
}
return 0;
}