isa/imp

# _isa

isa指针是一个指向所属类的指针,它标注着一个实例对象的真实类型。

在Object-C中消息机制是依靠objc_msgSend()这个函数发送消息,

objc_msgSend含两个参数:receiver、selector。即:objc_msgSend(receiver, selector);

而objc_msgSend通过isa指针,找到实例对象所属的类,也就找到了其全部父类

## 一个方法被调用要经过的真实步骤

当我门向一个对象发送消息去调用他的方法时,objc_msgSend会根据该实例对象的isa指针去查找该对象的类,然后去查找该类的disptach table中的selector,如果找不到就会依次向上查找它的父类,并在其父类的dispatch table中查找相应的selector,直到NSObject类。一旦找到该selector,objc_msgSend会根据dispatch table中内存地址去调用该selector。这样实现message和selector在执行阶段的动态绑定。为了提高这种查找转发的效率。系统会把所有的selector内存地址和调用过的selector的内存地址缓存起来。而通过类的形式划分不同的缓存区域。每一个类的缓存区域会包括自己的selector和继承自父类的selector,在objc_msgSend去查找disptach table前,会先去检查该类的缓存。如果缓存命中,就直接调用selecotr。

## imp指针

IMP这个函数指针指向了方法实现的首地址,当OC发起消息后,最终执行的代码是由IMP指针决定的。

imp指针的地址打印来看貌似这个方法是将两个方法的imp指针做了互换。

## SEL

类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容