美文网首页学习
iOS底层day2 - isa和Superclass

iOS底层day2 - isa和Superclass

作者: 宁夏灼雪__ | 来源:发表于2018-08-23 17:59 被阅读73次

写在前面

开发了3年的iOS了,虽然接触了许多七七八八的东西、技术,但是感觉iOS却没有什么质的飞越,可能跟自己接触的项目深度有关,于是决定在学习其他技术的同时,加强自己在iOS方面的学习,提高自己的竞争力。
这里以MJ老师的底层视频,写出自己对学习底层原理理解

对象&类对象&元类对象(Object & Class & Meta Class)

实例对象(Object) : 例如 NSObject *obj =[[NSObject alloc] init] ,创建出来的就是一个实例对象,实例对象记录着实例对象的isa指针和其他成员变量等
类对象 (Class) : 类的本质也是一个对象,就是类对象,通过Class objClass = [NSObject class] 可以获得类对象,类对象由编译器生成,记录着类的对象方法和类对象的isa指针和superClass指针以及其他成员变量等
元类对象 (Meta Class): 元类是对类的描述,记录着类的类方法以及isa指针和superClass指针等
类对象元类对象在内存中的结构是一样的

验证对象存储内容

我们打开obj4源码(obj4源码可在day1查看下载方式),搜索objc_class探索类对象的结构体,我们发现

FE151C44-ECC4-4AB6-8E8E-55D2AA6D2BEB.png
9C35B84C-CDBE-4360-830E-A70EA3E5F12A.png
15F63C61-407F-4844-806A-4912F5DED6F2.png
C9694A62-EB72-4096-BFDE-7689D045329D.png

objc_class继承自 objc_object 存储着isasuperclasscachebits,而bits通过位运算可以获得表class_rw_t,其中包含着methods(方法)、properties(属性)和protocal等,而class_rw_t表又存储着 class_ro_t表,class_ro_t表存储着name(类明),ivars(成员变量)等信息

最后用一张图来总结类对象的结构体存储


E14EE981-F081-4E38-A5A0-1E6EC68DAEF3.png

isa

10557ADD-8CAA-4FC5-A734-6B2BB0E83EB6.png
实例对象isa指向类对象

当我们创建一个对象,并要调用他的对象方法,但是实例对象的对象方法是存储在类对象里面,而我们调用对象方法实际上是给对象发送消息,如果实例对象和类对象没有什么关联的话,最终方法是没办法调用成功的,所以这里isa是指向类对象(我们可以这样记忆实例对象的isa)
例如 :

10557ADD-8CAA-4FC5-A734-6B2BB0E83EB6.png

这里,student调用 studentInstanceMethod对象方法,是通过studentisa指针,找到student类对象所存储的对象方法执行

类对象isa指向元类对象

同理,由于类方法存储在元类对象内,而我们调用类方法isa指向元类对象,才能执行类方法

F418CA07-F14F-4D12-AB70-BA6312052D48.png
这里,Student调用 studentClassMethod对象方法,是通过Studentisa指针,找到Student元类对象所存储的类方法执行

这里我们用一幅图总结isa实例对象 & 类对象 & 元类对象的指向

20CC1520-48B7-4C85-AEF8-9CCC46DBC2CE.png

isa扩充

在64位系统下isa并不是直接存储指向的对象地址,而是需要位运算(&) ISA_MASK

CA056208-F993-4676-9A46-2B6A65D5958F.png

__arm64__ : iOS64位系统
__x86_64__ : Mac 64位系统

Superclass

子类的类对象Superclass指向父类的类对象

如图


A806D728-E2C1-40AB-BCDC-E7EA4181910E.png

Student调用父类Person的类方法,首先Student通过本身的isa指针找到Student元类对象,发现没有personClassMethod方法,便去Person元类对象找,这时候就需要通过StudentSuperclass指针,才能找到Person元类对象,并调用方法

我们用一幅图来总结Superclass的指向

B54765EF-6ADB-4AB5-98D3-C5030C7C93F5.png
Tip

Superclass就是直接指向父类的内存地址值

总结

我们用一幅图总结isaSuperclass的指向

323C7058-218B-45E1-B58B-317183B9A1B7.png

相关文章

网友评论

    本文标题:iOS底层day2 - isa和Superclass

    本文链接:https://www.haomeiwen.com/subject/hwumiftx.html