• runtime运行时,类、对象、isa指针


    先查看一段OC源码,关于类的定义:

    /// An opaque type that represents an Objective-C class.
    typedef struct objc_class *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;
        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;

    对象的定义:

    /// Represents an instance of a class.
    struct objc_object {
        Class isa  OBJC_ISA_AVAILABILITY;
    };

    泛型的定义:

    /// A pointer to an instance of a class.
    typedef struct objc_object *id;

    1、在Objective-C中,任何类,它自身也是对象。

    2、Objective-C类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针;

    3、对象的结构体中,只有一个指向其类的isa指针;

    4、isa:是一个Class类型的指针;

           每个实例对象也有个isa指针,指向自身类;

         每个类也有个isa指针,指向meta-class(元类);

         meta-class的isa指向其基类的meta-class,以此作为它们的所属类。

    任何NSObject继承体系下的meta-class都使用NSObject的meta-class作为自己的所属类,而基类的meta-class的isa指针是指向它自己。这样就形成了一个完美的闭环。

    isa作用:当一个对象收到一条消息时,runtime会根据isa指针找到能够响应这个消息的对象,然后在该对象所属类的方法列表中查找消息对应的selector指向的方法,若没有找到对应的方法,meta-class会向父类查找方法。找到后即运行这个方法。

    5、super_class:指向该类父类的Class类型指针。如果该类已经是最顶层的父类,则super_class为NULL;

    6、ivars:成员变量的数组

    7、cache:用于缓存最近调用的方法。提高调用效率。

    8、version:类的版本信息,默认为0。

  • 相关阅读:
    关于C的struct结构的几个常见疑问。
    NAT类型
    Linux oops stack 分析
    关于pci_dev的定义
    还是动态添加控件 触发事件
    页面编译模型
    MDX 销售额与上月比较
    C语言的词法语法分析lex&yacc 经典收藏
    interrupt storm
    js获取mac地址
  • 原文地址:https://www.cnblogs.com/xiu619544553/p/5845978.html
Copyright © 2020-2023  润新知