使用场景:
动态交换两个方法的实现 method_exchangeImplementations
替换系统方法,做一些自己想要的操作:swizzing hook
常见的崩溃比如,NSArray 取值越界,NSDictionary 传了 nil 对象,这些问题产生的崩溃可以使用 Runtime 中的 Method Swizzle, 将原生的方法 hook 掉 (本质是方法交换,将自己的定义方法与系统的方法进行imp 交互)。
交换方法地址实现地址 :swizzing hook- 实现案例
实现NSCoding的自动归档和自动解档 & 实现字典转模型转换
1. 不用对每个属性edcode和decode了,如果几十个属性一个个的encode和decode真的很麻烦啊,使用运行时可以遍历出对象的所有属性,数组的方式遍历进行 eccode, decode操作
2. 运行时动态获取属性的属性名的方法,来进行字典转模型替换,字典转模型
都会用下下面这些方法:
获得成员变量的名字: ivar_getName
获得成员变量的类型: ivar_getTypeEndcoding
获得某个类的所有成员变量(outCount 会返回成员变量的总数): 下面2个方法都可以,在swift 中用2 ,成员变量是_name, 属性是@property 修饰的 name 变量。
1. 获取成员变量列表: class_copyIvarList
2. 获取属性列表: class_copyPropertyList
遍历出对象的所有属性动态添加属性:给分类添加属性
给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间。
分类添加属性方法给系统 NSObject 添加一个分类,在分类中是不能够添加成员属性的,虽然用@property,但是仅仅会自动生成get和set方法的声明,并没有带下划线的成员变量 和方法实现生成。可以通过runtime 做到动态添加方法的实现,但是还是不能直接使用成员变量,比如_name = @"wx", 会报错。
分类详解: 分类了解 --传送门
动态变量控制
修改属性值多继承 : 多继承实现3中方式: 协议,分类,消息转发
其他使用:
1. 路由跳转 ,解耦
2. 动态添加方法:消息转发机制, class_addMethod 函数添加方法
3. weak 指针指向的指针置为nil
4. NSTimer 内存泄漏,循环引用中,使用继承自NSProxy 的类,来进行消息转发。
5. 无侵入埋点
runtime 日常使用 :
2. 动态变量控制 :runtime一般用法和原理_wode_weiyi的博客-CSDN博客_runtime
3. 字典转模型的实现 :OC最实用的runtime总结,面试、工作你看我就足够了! - 简书
网友评论