Runtime 使用场景

使用场景:

动态交换两个方法的实现  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 日常使用 :

1. 给分类(Category)添加属性 -

2. 动态变量控制 :runtime一般用法和原理_wode_weiyi的博客-CSDN博客_runtime

3. 字典转模型的实现 :OC最实用的runtime总结,面试、工作你看我就足够了! -

你可能感兴趣的:(Runtime 使用场景)