iOS用runtime实现归档解归档

好多人对runtime的使用方法应该还是懵的,现在我就举个例子

我们在持久化的时候可能会选择归档解,加入现在我们有个Person类,需要对里面的name属性和age属性做归档,通常的做法如下

@interface Person : NSObject<NSCoding>

//需要归档的属性

@property (nonatomic, strong)NSString       *name;

@property (nonatomic, assign)NSInteger      age;

@end

 

在.m方法里实现协议

- (void)encodeWithCoder:(NSCoder*)coder {

//告诉系统归档的属性是哪些

[coder encodeObject:self.name forKey:@"name"];

[coder encodeInteger:self.age forKey:@"age"];

}

- (instancetype)initWithCoder:(NSCoder*)coder {

self= [super init];

if(self) {

//解档

self.name = [coder decodeObjectForKey:@"name"];

self.age = [coder decodeIntegerForKey:@"age"];

}

return self;

}

使用runtime方法实现:

- (void)encodeWithCoder:(NSCoder*)coder {

//告诉系统归档的属性是哪些

unsigned int count = 0;

//表示对象的属性个数

Ivar *ivars = class_copyIvarList([Person class], &count);

for(inti = 0; i<count; i++) {

//拿到Ivar

Ivar ivar = ivars[i];

const char*name = ivar_getName(ivar);//获取到属性的C字符串名称NSString*key = [NSStringstringWithUTF8String:name];

//转成对应的OC名称

//归档 -- 利用KVC

[coder encodeObject:[self valueForKey:key] forKey:key];

}

free(ivars);

//在OC中使用了Copy、Creat、New类型的函数,需要释放指针!!(注:ARC管不了C函数)

}

- (instancetype)initWithCoder:(NSCoder*)coder {

self= [super init];

if(self) {

//解档unsigned int count = 0;

Ivar *ivars = class_copyIvarList([Person class], &count);

for(int i = 0; i<count; i++) {

//拿到Ivar

Ivar ivar = ivars[i];

const char*name = ivar_getName(ivar);

NSString*key = [NSStringstringWithUTF8String:name];

//解档

id value = [coder decodeObjectForKey:key];

// 利用KVC赋值

[self setValue:value forKey:key];

}

free(ivars);

}

return self;

}

使用runtime的好处不言而喻,无论对象有多少属性都可以通过这个for循环搞定,非常棒。

 

 

 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值