isa
在objc.h的头文件,关于objc_object结构体的声明中,我们可以看到isa是一个Class类型的指针,指向的是对象所属于的类。如果这个对象是一个类对象,那么isa就指向这个类的元类。

但是当你查看objc_object结构体的源文件时,里边确是如下的定义,

isa_t是一个联合结构体。
因为2013年发布iphone5s,采用了64位的处理器,为了节省内存和提高执行效率,苹果对isa指针进行了优化。如果系统支持isa优化那么它就不一定是一个指向实例对象所属的类了。这里涉及到一个tagged pointer概念,也就是优化的主要内容。内部会通过判断,当前isa是一个指向类的指针,还是代表它是一个值,比如NSNumber。关于isa_t这个结构体,也有很多的内容,比如引用计数,weak变量的引用情况,析构状态等等。
https://www.jianshu.com/p/b4104747a592关于tagger pointer 和 NONPOINTER
SELselector是方法选择器,可以理解为区分方法的ID,而这个ID的数据结构是SEL。其实它就是个映射到方法的C字符串,你可以用Objc编译器命令 @selector() 或者Runtime系统的 sel_registerName 函数来获得一个 SEL 类型的方法选择器。
IMP是一个函数指针,指向的是函数的具体实现。在runtime中消息传递和转发的目的就是为了找到IMP,并执行函数。
Method是代表类中的某个方法的类型

方法名类型为 SEL,前面提到过相同名字的方法即使在不同类中定义,它们的方法选择器也相同。
方法类型 types 是个char指针,其实存储着方法的参数类型和返回值类型。
imp 指向了方法的实现,本质上是一个函数指针。
网友评论