美文网首页
类的结构

类的结构

作者: 算命的李老师 | 来源:发表于2020-03-17 15:13 被阅读0次
    (Class superClass.png
    ==objc_class==
    struct objc_class {
    
    Class isa  OBJC_ISA_AVAILABILITY;
    
    #if !__OBJC2__
    
    Class super_class                       OBJC2_UNAVAILABLE;  // 父类
    
    const char *name                        OBJC2_UNAVAILABLE;  // 类名
    
    long version                            OBJC2_UNAVAILABLE;  // 类的版本信息,默认为0
    
    long info                               OBJC2_UNAVAILABLE;  // 类信息,供运行期使用的一些位标识
    
    long instance_size                      OBJC2_UNAVAILABLE;  // 该类的实例变量大小
    
    struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 该类的成员变量链表
    
    struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定义的链表
    
    struct objc_cache *cache                OBJC2_UNAVAILABLE;  // 方法缓存
    
    struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 协议链表
    
    #endif
    
    } OBJC2_UNAVAILABLE;
    
    ==isa 指针==

    我们创建的一个对象或实例其实就是一个 struct objc_object 结构体,而我们常用的id也就是这个结构体的指针。
    这个结构体只有一个成员变量,这是一个Class类型的变量isa,也是一个结构体指针。
    对象的isa指针就指向对象所属的类。

    ==元类==

    元类的定义:元类是类对象的类。
    struct objc_classs 结构体里存放的数据称为元数据(metadata),里面存放有指向父类的指针、类的名字、版本、实例大小、实例变量列表、方法列表、缓存、遵守的协议列表等

    ==类对象==

    Class本身其实也是一个对象,我们称之为类对象。
    类对象在编译期产生用于创建实例对象,是单例

    NSString *str = @"Hello World";

    str对象本质就是一个
    objc_object结构体,而这个结构体的成员变量isa指针则表明了str is a NSString,因此这个isa就指向了NSString类,这个NSString类其实是类对象。
    类对象的isa指针指向的我们称之为元类(metaclass)

    ==类簇==

    类簇实际上是Foundation framework框架下的一种设计模式,它管理了一组隐藏在公共接口下的私有类。
    如图 NSNumber就是个类簇
    [图片上传失败...(image-9851e1-1584429110930)]

    ==分类==
    • 分类是不能添加属性的,只能关联属性。
    • 是在在类中用二维数组维护。
    • 当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次
    • 在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的

    分类为什么用二维数组存储

    ==关联对象==

    关联对象由AssociationsManager 管理并在AssociationsHashMap存储。这是一个全局的容器。

    ==isa指向==
    • 实例对象isa指针指向类对象
    • 类对象的isa指针指向了元类
    • 元类isa指向根元类
    • 根元类isa指向自己
    ==super_class指向==
    • super_class指针指向了父类的类对象
    • 元类的super_class指针指向了父类的元类

    相关文章

      网友评论

          本文标题:类的结构

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