引入头文件:#import <objc/message.h>
Runtime 给OC提供的运行时,装在内存中的代码,Runtime 有两个版本 一个是Legacy(早期版本),一个Modern版本(现有版本)
三种方式引入Runtime :
Objective-c Code [person sayNB] 、Framework&Serivce isKindofClass 、 Runtime API class_getInstanceSize
图(1)objc_msgSend的使用方式:方法 :消息(消息接收者,消息主体)objc_msgSend(<#id _Nullable self#>, <#SEL _Nonnull op, ...#>)
列子:
LGPerson*person = [LGPersonalloc];
objc_msgSend(person,sel_registerName("onFunction"));
c找方法:通过函数名找地址指针
OC找方法:方法在底层是消息(sel ,imp) 通过方法编号(sel)绑定imp(函数指针地址),找到具体的内容,所以比c会慢
objc_msgSend里面有消息接收者,消息接收者才能找到旋耕路径
方法是存在于类和元类里面,因为类和元类有(实例或者类)对象,对象里面有isa,所以通过对象的isa找到类,再找到cache_t(缓存),如果没有缓存,就找到methodList
Sel怎么找到imp ?
通过汇编:特性就是快
图(2)objc_msgSend流程图:
图(3)消息转发机制:
图(4)
网友评论