在之前开发的项目中有用到归档和解挡,在项目中用的是比较笨的方法,直接在
- (void)encodeWithCoder:(NSCoder *)encoder和-(id)initWithCoder:(NSCoder *)decode方法中直接设置每一个属性进行归档和解档,代码如下:
新建Person类
Person.h
@interface Person : NSObject <NSCoding>
// 姓名
@property (copy, nonatomic) NSString *name;
// 年龄
@property (copy, nonatomic) NSString *age;
// 身高
@property (copy, nonatomic) NSString *stature;
@end
Person.m
#import "Person.h"
@implementation Person
/** 归档 */
- (void)encodeWithCoder:(NSCoder *)coder{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeObject:self.age forKey:@"age"];
[coder encodeObject:self.stature forKey:@"stature"];
}
/** 解档 */
- (instancetype)initWithCoder:(NSCoder *)coder{
if (self = [super init]) {
self.name = [coder decodeObjectForKey:@"name"];
self.age = [coder decodeObjectForKey:@"age"];
self.stature = [coder decodeObjectForKey:@"stature"];
}
return self;
}
@end
上面的方法虽然可行,但是如果如果类属性比较多的时候那就有点。。。
之前的项目中要进行归档和解档的类一共有20个属性,然后傻逼直接使用上面的方法。。。
但是如果使用runtime获取类的属性代码就简单多了,而且效率还是上面的方法高。
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([Person class], &count);
for (int i=0; i<count; i++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
NSLog(@"%@", key);
}
输出结果:
![](https://img.haomeiwen.com/i2103803/39afe0b8322046f2.png)
获取到属性之后只要在for循环中进行归档和接档即可。
归档、解档代码如下:
/** 归档 */
- (void)encodeWithCoder:(NSCoder *)coder{
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([Person class], &count);
for (int i=0; i<count; i++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
[coder encodeObject:[self valueForKey:key] forKey:key];
}
}
/** 解档 */
- (instancetype)initWithCoder:(NSCoder *)coder{
if (self = [super init]) {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([Person class], &count);
for (int i=0; i<count; i++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [coder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
}
return self;
}
网友评论