runtime之实现对象序列化
/*
iOS序列化,将对象转成二进制,保存到本地
*/
定义一个对象,让它实现NSCoding协议,保证对象的编码和解码,person有三个属性
@interface Person : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, copy) NSString *gender;
@end
#import "Person.h"
#import <objc/message.h>
@implementation Person
//编码
- (void)encodeWithCoder:(NSCoder *)aCoder
{
/*原始写法,需要将对应的属性一个个设置一遍,若有很多属性,就会很麻烦,不灵活, 而且还要设置key,取的时候不小心写错的话,就会有问题
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt:_age forKey:@"age"];
[aCoder encodeObject:_gender forKey:@"gender"];
*/
/*利用runtime*/
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([Person class], &count); //得到Person所有的属性列表,ivars指向第0个属性
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i]; //得到第i个属性
const char *paramName = ivar_getName(ivar); //得到属性名,带下划线的
NSString *key = [NSString stringWithUTF8String:paramName];
//得到属性的值,通过KVC,KVC会先去找没有下划线的属性名,若没有找到,就去找带下划线的属性名,如age属性,KVC会先找age,若找不到,则去找_age
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key]; //把对应的值设置进去
}
}
//解码
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
/*原始写法,需要将对应的属性一个个设置一遍,若有很多属性,就会很麻烦,不灵活, 而且还要设置key,取的时候不小心写错的话,就会有问题
_name = [aDecoder decodeObjectForKey:@"name"];
_age = [aDecoder decodeIntForKey:@"age"];
_gender = [aDecoder decodeObjectForKey:@"gender"];
*/
/*利用runtime*/
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([Person class], &count); //得到Person所有的属性列表,ivars指向第0个属性
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i]; //得到第i个属性
const char *paramName = ivar_getName(ivar); //得到属性名,带下划线的
NSString *key = [NSString stringWithUTF8String:paramName];
//将key对应的属性进行解码
id value = [aDecoder decodeObjectForKey:key];
//设置属性的值,通过KVC,KVC会先去找没有下划线的属性名,若没有找到,就去找带下划线的属性名,如age属性,KVC会先找age,若找不到,则去找_age
[self setValue:value forKey:key];
}
}
return self;
}
最新文章
- C#中的委托与事件并存的理由
- css 3 动画
- Portal.MVC —— nopcommerce的简化版
- iOS解析数据时Error=3840
- opencv统计二值图黑白像素个数
- [firefox]在Debian7及其衍生版下安装firefox
- Hive 实战(2)--hive分区分桶实战
- Observer模式
- php基础33:正则匹配-perl
- MVC4.0 实现单一Action返回多种结果
- [Excel操作]Microsoft Office Excel 不能访问文件
- MVC-Model数据注解(一)-系统(DataAnnotations)
- statfs函数说明
- JavaScript看书笔记01
- 【http转https】其之三 IIS_URL重写_http重定向到https
- AtCoder Grand Contest 019
- BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
- Redis须知重点
- 搭建好lamp,部署owncloud。
- 回顾JavsScript对象的克隆
热门文章
- bitShark对Android版本的支持
- Java RandomAccessFile类
- jar word 模板操作比较好用的工具
- Android gradle 相关配置
- 记一次痛苦的ubuntu配置Go环境 -- Ubuntu &; Go
- android与服务器交互总结(json,post,xUtils,Volley)
- 【层次查询】Hierarchical Queries之亲兄弟间的排序(ORDER SIBLINGS BY)
- java设计模式之-建造者模式
- 《图论》——广度优先遍历算法(BFS)
- asp .net 为图片添加文字水印(内包含有加图片水印的方法) .