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