Runtime的基本属性和消息转发机制已经介绍过了,下面来了解一些Runtime提供的api在实际项目中的应用。
Runtime在项目中的实际应用主要包括几个方面
一、使用runtime交换方法。
在实际操作中我们可以使用class_getClassMethod方法来获得当前方法的Method 并且使用method_exchangeImplemetations()方法来实现方法的交换。
二、动态添加方法
class_addMethod(self,@selector(eat),eat,"v@:")
三、给分类添加属性
给分类添加属性需要在interface中先声明对应的属性
重写对象的set和get方法 注意在写set方法的时候要注意对应的参数类型(strong 和 assig)对应的参数是不一样的
objc_getAssociatedObject(self.key) 获得对应的方法
objc_setAssociatedObject( ) 添加对应的方法
四、KVO实现
KVO的机制依赖于runtime框架,当观察某对象时候,runtime会动态的创建一个子类, 并且重写了这个子类的setter方法 setter方法负责之后观察改变属性的状况。 生成的子类并不是完全的子类 , 有一些父类的方法会被重写 例如 调用子类的class方法的时候输出的还是父类的类名。
五、实现NSCoding的子宫归档和自动解档
用runtime提供的函数遍历model自身所有属性,并对属性进行encode和decode操作
要注意CopyIvarsList 和CopyIvarsProperty的区别 ,如果只有Property 那么只copy声明好的变量 如果是copylist 那么会copy所有包括在大括号中声明的所有变量六、热更新
使用objc_removeAssociatedObjects可以断开所有的关联。
但是通常情况下不建议使用,
因为它会断开所有已经写好的的关联属性。想要断开关联推荐使用objc_setAssociatedObject,将关联对象传入 nil就可以了。
网友评论