使用runtime的好处:1.当成员属性很多很多的时候大大减少了代码,
2.当成员属性修改了不影响该类的归档接档
建立一个类person,使用runtime实现该类的归解档
person.h
@interface Person : NSObject <NSCoding,NSSecureCoding>
@property (nonatomic, strong) NSString *name;
@end
person.m
#import "Person.h"
#import <objc/runtime.h>
@interface Person ()
{
int _age;
}
@end
@implementation Person
- (instancetype)init {
self = [super init];
if (self) {
_age = 12;
}
return self;
}
// 解档使用
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
unsigned int count = 0;
Ivar *list = class_copyIvarList(self.class, &count);
for (int i = 0; i < count; i++) {
NSString *name = [NSString stringWithUTF8String:ivar_getName(list[i])];
[self setValue:[aDecoder decodeObjectForKey:name] forKey:name];
}
}
return self;
}
// 归档使用
- (void)encodeWithCoder:(NSCoder *)coder {
unsigned int count = 0;
Ivar *list = class_copyIvarList(self.class, &count);
for (int i = 0; i < count; i++) {
NSString *name = [NSString stringWithUTF8String:ivar_getName(list[i])];
NSString *value = [self valueForKey:name];
[coder encodeObject:value forKey:name];
}
}
// NSSecureCoding协议需要实现的方法
+ (BOOL)supportsSecureCoding {
return YES;
}
- (NSString *)description {
return [NSString stringWithFormat:@"name=%@ age=%d",_name,_age];
}
@end
调用处如下
ViewController.m
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
{
NSData *_data;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
// 归档的button点击实现 xib
- (IBAction)save:(id)sender {
Person *p = [[Person alloc] init];
p.name = @"12";
NSError *error;
_data = [NSKeyedArchiver archivedDataWithRootObject:p requiringSecureCoding:NO error:&error];
if (error) {
NSLog(@"zhousuhua error=%@ data=%@",error,_data);
} else {
NSLog(@"zhousuhua success error=%@ data=%@",error,_data);
}
}
// 接档button的点击事件,xib
- (IBAction)get:(id)sender {
NSError *error;
Person *p = [NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:_data error:&error];
if (error) {
NSLog(@"zhousuhua error=%@ description=%@",error,p.description);
} else {
NSLog(@"zhousuhua success=%@ description=%@",error,p.description);
}
}
@end