美文网首页
02.OC有几种对象

02.OC有几种对象

作者: 白开了杯水 | 来源:发表于2021-08-19 10:36 被阅读0次

    之前章节
    01.OC实例对象的本质

    在讲接下来的内容前,让我们先来认识下OC究竟有多少种对象
    OC对象总共有三种

    • instance对象(实例对象)
    • class对象(类对象)
    • meta-class对象(元类对象)
    instance对象

    它主要通过类alloc出来,每次alloc都是新的对象,在内存中存储的信息有

    • 成员变量(包括isa指针也是成员变量)
      例如我们在第一章节讲的就是实例对象
    class对象

    获取方法

    • 实例对象class方法
    • 类class方法
    • 运行时object_getClass函数


      class类对象的获取方法

    如上图,大家输出的三个地址是一样的么?
    答案是肯定的:类对象是唯一的,只存在一个,它在内存中存储的信息主要有

    • isa指针
    • superclass指针
    • 类的属性property
    • 类的对象方法信息instance method
    • 类的协议信息 protocol
    • 类的成员变量信息ivar(一些描述信息,如类型 名称)
    • ...
    meta-class元类对象

    获取方法

    • 运行时object_getClass函数


      meta-class获取方法

    从上图代码我们可以看到,他们输出的地址是不一样的,元类也是唯一的,而且内存结构与Class一致,只不过用途不一样,它在内存中存储的信息主要有

    • isa指针
    • superclass指针
    • 类的类方法信息(class method)
    • ...

    如果我们要判断它是否是元类对象,可以这样写

    bool isMetaClass = class_isMetaClass(mc);
    

    注意,以下代码获取的还是类对象而不是元类对象

    Class cls = [[Animal class] class];
    bool isMetaClass = class_isMetaClass(cls); // 为NO
    

    可能你会说,光靠嘴上说说如何证明,那么我们就直接来看看runtime的源码,摘自objc4-818.2版本
    首先我们找到Class编译后的结构体objc_class


    过期的objc_class源码

    我们应该看最新版本的objc_class源码,在objc_runtime-new中,部分源码如图


    objc_class最新源码

    它有一个叫superclass的成员变量,这就证明了每个对象都拥有superclass成员,那isa又在哪里呢,可以看到objc_class继承自objc_object,那我们继续看看objc_object里面有什么


    objc_object最新源码

    它拥有一个isa指针变量,这就证明了对象由isa成员变量,接下来我们继续看objc_class里面还有什么,它还有一个cache(不理)和bits,bits为class_data_bits_t结构体,继续查看class_data_bits_t定义


    class_data_bits_t源码

    大概是这样子


    class_ data_ bits_t结构图

    在class_rw_t源码中,我们可以找到以下代码


    class_rw_t部分源码

    大概是这样子


    class rw t结构图

    分别有方法列表、协议列表、属性列表等,这也就证明了我们前面说的对象包含了什么,另外,class_rw_t还包含了一个class_ro_t,它有什么东西,具体看下图


    class_rw_t的class_ro_t
    class_ro_t部分源码

    从图可以看到它拥有了name、ivars、baseMethodList、baseProtocols、baseProperties等等...,大概是这样子


    class_ro_t结构图

    那这些有啥用呢,留到后续再讲,这里先给大家一个印象
    最后,整个类基础数据结构图大概是这样


    objc_object结构图

    以上我们从源码角度分析了object包含了什么,其实也可以从运行代码调试角度来查看,复写它们的结构体成员就可以在xcode调试查看了,这里不做示范

    扩展
    • class_rw_t -> class_readwrite_table -> 可以读写的表
    • class_ro_t -> class_readonly_table -> 只读的表
    • ivars -> instance variable 复数 -> 成员变量们

    OC对象的类别讲到这里,接下来将介绍isa和superclass的用途
    本文部分知识参考自李明杰老师的教程

    相关文章

      网友评论

          本文标题:02.OC有几种对象

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