0%

RunTime - 归档

DouBanModel.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#import "DouBanModel.h"
#import <objc/runtime.h>

#pragma mark - 可以写成宏

#define encodeCoderWithRuntime(model)\
unsigned int count = 0;\
Ivar *ivars = class_copyIvarList([model class], &count);\
for (int i = 0; i < count; i ++) {\
Ivar ivar = ivars[i];\
NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];\
id value = [aCoder valueForKey:key];\
[aCoder encodeObject:value forKey:key];\
}\
free(ivars);\

#define initCoderWithRuntime(model)\
self = [super init];\
if (self) {\
unsigned int count = 0;\
Ivar *ivars = class_copyIvarList([model class], &count);\
for (int i = 0; i < count; i ++) {\
Ivar ivar = ivars[i];\
NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];\
id value = [aDecoder decodeObjectForKey:key];\
[self setValue:value forKey:key];\
}\
free(ivars);\
}\
return self;\

@implementation DouBanModel

#pragma mark - 用Runtime实现归档解档
// 存
- (void)encodeWithCoder:(NSCoder *)aCoder {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([DouBanModel class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
//归档
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key];
}
free(ivars);
}

// 解
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([DouBanModel class], &count);
for (int i = 0; i < count; i ++) {
// 取出成员变量
Ivar ivar = ivars[i];
NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
//归档
id value = [aDecoder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}

@end


@implementation MovieInfo

#pragma mark - 模型里面套模型的归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([MovieInfo class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
//归档
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key];
}
free(ivars);
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
initCoderWithRuntime(MovieInfo);
}

@end

Demo 地址

https://github.com/GhostClock/Runtime-Demo