美文网首页学习
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