runtime机制

  • Post author:
  • Post category:其他


runtime(

简称运行时

),是一套 纯C(C和汇编写的) 的API。而 OC 就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。

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

每一个 OC 的方法,底层必然有一个与之对应的

runtime

方法。

runtime常见作用:

1、动态交换两个方法的实现

2、发送消息

3、动态添加方法

4、拦截替换方法

消息机制方法调用过程:

1、OC 在向一个对象发送消息时,

runtime

库会根据对象的

isa

指针找到该对象对应的类或其父类中查找方法。

2、注册方法编号(这里用方法编号的好处,可以快速查找

3、根据方法编号去查找对应方法。

4、找到只是最终函数实现地址,根据地址去方法区调用对应函数。

runtime常见的方法:

Person *p = [Person alloc];
// 底层的实际写法
Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));

// 获取某各类的方法


Method imageNamedMethod = class_getClassMethod(

self,

@selector(imageNamed:));


交换方法地址,相当于交换实现方式;method_exchangeImplementations 交换两个方法的实现

获取类中所有的属性
class_copyIvarList

遍历属性找到对应name字段

const char *varName = ivar_getName(var);


例类的扩展常规下是不能添加成员属性的,但是可以通过runtime添加
– (

void)setName:(

NSString *)name {




// objc_setAssociatedObject(将某个值跟某个对象关联起来,将某个值存储到某个对象中)






// object:给哪个对象添加属性








// key:属性名称










// value:属性值

/













/ policy:保存策略













objc_setAssociatedObject(

self,

@”name”, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

















} –

















(

NSString *)name {





















return objc_getAssociatedObject(

self,

@”name”);

























}

























这样就能添加上了












每一个对象内部都有一个isa指针,这个指针是指向它的真实类型,根据这个指针就能知道将来调用哪个类的方法。

转载于:https://www.cnblogs.com/Acee/p/8808610.html