写一个分类 遵守协议
#import <Foundation/Foundation.h>
demo下载地址 http://download.csdn.net/detail/xlsn0w/9429196
@interface NSObject (Encode) <NSCoding>
@end
在m文件里面实现归档 反归档方法
#import <objc/objc-runtime.h>
@implementation NSObject (Encode)
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [selfinit];//如果在分类中要使用super的方法因为木有super 只能self来替代
if (self) {
//1. 获取all 实例变量
unsigned int outCount =0;
Ivar *ivar = class_copyIvarList([self class],&outCount);
for (int i =0; i < outCount; i++) {
//2. 获取当前的实例变量
Ivar ivar2 = ivar[i];
const char *nameUTF = ivar_getName(ivar2);
NSString *name = [NSStringstringWithUTF8String:nameUTF];
id value = [aDecoder decodeObjectForKey:name];
//5 对应的实例变量赋值 KVC
[self setValue:value forKey:name];
}
free(ivar);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
//1.获取所有的实例变量
unsigned int outCount =0;
Ivar *ivar = class_copyIvarList([selfclass], &outCount);
for (int i =0; i < outCount; i++) {
//2 get当前实例变量
Ivar ivar2 = ivar[i];
//3 获取当前实例变量的名字
const char *nameUTF =ivar_getName(ivar2);
NSString *name = [NSStringstringWithUTF8String:nameUTF];
//4 获取实例变量的值 KVC
id value = [selfvalueForKey:name];
[aCoder encodeObject:value forKey:name];
}
//5 free()释放
free(ivar);
}
在控制器里面实现Person的属性的验证
#import "ViewController.h"
#import "NSObject+Encode.h"
#import <objc/objc-runtime.h>
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *person = [Personnew];
person.name = @"XL";
person.age = 24;
NSMutableData *data = [NSMutableDatadataWithCapacity:5];
NSKeyedArchiver *arc = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data];
[arc encodeObject:person forKey:@"person"];
[arc finishEncoding];
NSKeyedUnarchiver *unarc = [[NSKeyedUnarchiveralloc] initForReadingWithData:data];
Person *person2 = [unarc decodeObjectForKey:@"person"];
NSLog(@"%@",person2.name);
NSLog(@"%ld",(long)person2.age);
}