runtime机制

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指针,这个指针是指向它的真实类型,根据这个指针就能知道将来调用哪个类的方法。
posted @ 2018-04-12 16:27  _Ace  阅读(195)  评论(0编辑  收藏  举报