runtime使用

#runtime简介


RunTime简称运行时,OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制;对于C语言,函数的调用在编译的时候会决定调用哪个函数。对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。

事实证明:在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错,在编译阶段,C语言调用未实现的函数就会报错。

#runtime作用

-消息分发:在Objective-C中,消息是通过objc_msgSend()这个runtime方法及相近的方法来实现的,这个方法需要一个target,selector,还有一些参数。理论上来说,编译器只是把消息分发变成objc_msgSend来执行,objc_msgSend,只有对象才能发送消息,因此以objc_msgsend开头.使用消息机制前提,必须如下:

#import  

Person *p = [[Person alloc] init];

objc_msgSend(p, @selector(eat));

-消息机制原理: 对象根据方法编号SEL去映射表查找对应的方法实现

-动态添加方法:要想动态添加方法首先理解消息转发机制,其中包括两种机制

.动态方法解析

+ (BOOL)resolveInstanceMethod:(SEL)sel

.完整的消息转发机制

runtime使用_第1张图片

-获取方法,属性,变量列表:  class_copyMethodList,class_copyPropertyList,class_copyIvarList这些都是class开头,也可以单独获取某个方法如:class_getClassMethod(类方法)class_getInstanceMethod(实例方法)等

-方法交换:

method_exchangeImplementations

-关联:动态添加属性,注:oc可以通过category添加方法,关联添加属性

关联对象:

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

获取关联的对象:

id objc_getAssociatedObject(id object, const void *key)

移除关联对象:

void objc_removeAssociatedObjects(id object)

推荐文章:


Runtime内功篇 

Runtime关联对象

Runtime 定制tabBarItem

你可能感兴趣的:(runtime使用)