# _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只是方法编号。