runtime 优化归档 ,替换方法
来源:互联网 发布:怪物猎人4g手机数据库 编辑:程序博客网 时间:2024/06/03 07:24
文/Gavin_peng(简书作者)
原文链接:http://www.jianshu.com/p/364eab29f4f5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/364eab29f4f5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
1.什么是runtime?
runtime是一套底层的C语言API,包含很多强大实用的C语言数据类型和C语言函数,平时我们编写的OC代码,底层都是基于runtime实现的。
2.runtime有什么作用?
1.能动态产生一个类,一个成员变量,一个方法
2.能动态修改一个类,一个成员变量,一个方法
3.能动态删除一个类,一个成员变量,一个方法
3.常用的头文件
#import <objc/runtime.h> 包含对类、成员变量、属性、方法的操作 #import <objc/message.h> 包含消息机制
4.常用方法
class_copyIvarList()返回一个指向类的成员变量数组的指针class_copyPropertyList()返回一个指向类的属性数组的指针
注意:根据Apple官方runtime.h文档所示,上面两个方法返回的指针,在使用完毕之后必须free()。
ivar_getName()获取成员变量名-->C类型的字符串property_getName()获取属性名-->C类型的字符串-------------------------------------typedef struct objc_method *Method;class_getInstanceMethod() class_getClassMethod()以上两个函数传入返回Method类型---------------------------------------------------method_exchangeImplementations()交换两个方法的实现
5.runtime在开发中的用途
1.动态的遍历一个类的所有成员变量,用于字典转模型,归档解档操作
代码如下:
- (void)viewDidLoad { [super viewDidLoad]; /** 利用runtime遍历一个类的全部成员变量 1.导入头文件<objc/runtime.h> */ unsigned int count = 0; /** Ivar:表示成员变量类型 */ Ivar *ivars = class_copyIvarList([BDPerson class], &count);//获得一个指向该类成员变量的指针 for (int i =0; i < count; i ++) { //获得Ivar Ivar ivar = ivars[i]; //根据ivar获得其成员变量的名称--->C语言的字符串 const char *name = ivar_getName(ivar); NSString *key = [NSString stringWithUTF8String:name]; NSLog(@"%d----%@",i,key);}}
运行结果如下:
获取一个类的全部属性:
结果如下:
应用场景:
- 可以利用遍历类的属性,来快速的进行归档操作。
将从网络上下载的json数据进行字典转模型。
注意:归档解档需要遵守<NSCoding>协议,实现以下两个方法- (void)encodeWithCoder:(NSCoder *)encoder{ //归档存储自定义对象 unsigned int count = 0; //获得指向该类所有属性的指针 objc_property_t *properties = class_copyPropertyList([BDPerson class], &count); for (int i =0; i < count; i ++) { //获得 objc_property_t property = properties[i]; //根据objc_property_t获得其属性的名称--->C语言的字符串 const char *name = property_getName(property); NSString *key = [NSString stringWithUTF8String:name]; // 编码每个属性,利用kVC取出每个属性对应的数值 [encoder encodeObject:[self valueForKeyPath:key] forKey:key]; }}- (instancetype)initWithCoder:(NSCoder *)decoder{ //归档存储自定义对象 unsigned int count = 0; //获得指向该类所有属性的指针 objc_property_t *properties = class_copyPropertyList([BDPerson class], &count); for (int i =0; i < count; i ++) { objc_property_t property = properties[i]; //根据objc_property_t获得其属性的名称--->C语言的字符串 const char *name = property_getName(property); NSString *key = [NSString stringWithUTF8String:name]; //解码每个属性,利用kVC取出每个属性对应的数值 [self setValue:[decoder decodeObjectForKey:key] forKeyPath:key]; } return self;}
二、交换方法
通过runtime的method_exchangeImplementations(Method m1, Method m2)方法,可以进行交换方法的实现;一般用自己写的方法(常用在自己写的框架中,添加某些防错措施)来替换系统的方法实现,常用的地方有:- 在数组中,越界访问程序会崩,可以用自己的方法添加判断防止程序出现崩溃数组或字典中不能添加nil,如果添加程序会崩,用自己的方法替换系统防止系统崩溃
- ...
代码实现如下:
再次运行刚才的程序:
0 0
- runtime 优化归档 ,替换方法
- runtime 方法替换实现
- runtime方法的替换
- Runtime中Swizz_method方法替换
- iOS 简单的runtime替换方法
- runtime之归档反归档
- runtime自动归档/解档
- Runtime 学习-自动归档
- runtime 进行归档
- runtime使用篇----归档和反归档
- 日常tip(runtime方法替换,数组多种排序)
- Objective-c runtime方法替换引发的死循环
- 利用Runtime 实现自动化归档
- 利用Runtime 实现自动化归档
- 利用Runtime 实现自动化归档
- 利用Runtime实现自动化归档
- 使用runtime归档模型对象
- 用runtime归档、解档、copy
- java 反射
- 大型网站架构系列:消息队列
- 从2月14号开始,上传AppStore会碰到:Failed to locate or generate matching signing assets
- C++一元运算符的构造函数重载和友元函数重载
- C++ inline 函数
- runtime 优化归档 ,替换方法
- layoutSubviews方法与drawRect方法的调用条件
- MVP模式
- C++的命名空间
- 杭电ACM吃糖果问题
- [疯狂Java]Swing
- 向大牛迈进
- JS基础
- shell流程控制