Runtime - 自动归档 其实没多少代码,直接看图吧
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
//存
- (IBAction)enter:(id)sender {
Person *p=[[Person alloc]init];
p.name=@"张三";
p.sex=@"男";
p.nickName=@"大王";
//归档路径,.data可以随便设置,但是只有当前程序能打开,比如: .我
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"person.data"];
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
}
//取
- (IBAction)out:(id)sender {
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"person.data"];
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"---%@--%@--%@",p.name,p.nickName,p.sex);
}
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong)NSString *name;
@property (nonatomic, strong)NSString *nickName;
@property (nonatomic, strong)NSString *sex;
@end
下边是重点:
#import "Person.h"
#import <objc/message.h>
@implementation Person
- (void)encodeWithCoder:(NSCoder *)encoder
{
unsigned int count = 0;
// 获取实例变量列表 Ivar *是一个指针,指向第一个变量的内存地址,ivars[0]
Ivar *ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i ++) {
// 获取i位置对应的实例变量
Ivar ivar = ivars[i];
// 获取实例变量的名字
const char *name = ivar_getName(ivar);
// C语言字符串转化为NSString
NSString *nameStr = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
// 利用KVC取出属性对应的值
id value = [self valueForKey:nameStr];
// 归档
[encoder encodeObject:value forKey:nameStr];
}
// C语言中出现 create,new,copy 出来的 ARC不管,需要手动释放
free(ivars);
}
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
id value = [decoder decodeObjectForKey:key];
// 设置到成员变量身上
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}
@end