对象在内存中可以看成是一个结构体,结构体的大小并不能动态变化,所以无法给运行时动态的给对象增加成员变量
相对应的,对象的的方法定义都保存在类的可变区域中,Object-c 并且在头文件中将实现暴露出来,但是在Object-C1.0中,方法的定义列表名为methodLists的指针的指针,如下图所示.通过修改该指针指向的指针的值,就可以动态的为某一个类增加成员方法.这个就是分类的实现原理也就是为什么Category只可以为对象增加成员方法.却不成增加成员变量
相关方法
1.import rumtime相关的头文件,objc/runtime.h
2.使用objc_allocateClassPair方法创建新的类
3.使用class_addMethod方法来给类增加新的方法
4.使用objc_registerClassPair来注册新的类
5.使用objce_getClass方法来获得对象的isa的指针所指向的对象
1.类也是一个一个对象,所以它也必须是另一个类的实例这个类就是元类(metaclass)元类保存了类方法的列表,当类方法被调用时,元类会首先查找本身是否有还类方法的实现,如果没有,则该元类会向它的父类查找该方法,一直到继承链的头
元类也是一个对象,那么元类的isa指针又是指向哪里呢?所有的元类isa指针都会指向一个根元类(root
metaclass)跟元类本身的isa指针指向自己.
Class_replaceMethod替换类方法的定义
Method_exchangeImplementations交换两个方法的实现
Method_setImplementation设置一个方法的实现
Class_replaceMetod,当需要替换的方法不存在时,使用该方法
Method_exchangeImplementations交换两个方法的实现
Method_setImplementation是最简单的用法,当仅仅需要为一个方法设置其实现方式时使用
惊天大秘密runtime的使用
AFNetworking
(V1.x版本)使用了class_replaceMethod方法(AFHTTPRequestOpera-tion.m文件的105行)面试的时候把这句话说出来绝对让面试官懵逼
Nimbus是注明的工具类库,它在其core模块中提供了NIRuntimeClassModifications.h文件用于提供API的封装
国内的大众点评iOS客户端.该客户端使用了他们自己开发基于Wax修改而来的WaxPatch通过服务器更新的动态修改客户端的逻辑.而WaxPatch主要是修改了Wax中的wax_instance.m文件.在其中加入了class_replaceMethod来替换实现,从而改变客户端的原有行为