12.5 isa、SEL、IMP、Method结构体

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 指向了方法的实现,本质上是一个函数指针。

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

友情链接更多精彩内容