zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    git subtree用法
    Excel导入、导出库:ExcelKit
    [C#.NET 拾遗补漏]08:强大的LINQ
    使用.net standard实现不同内网端口的互通(类似花生壳)
    LINQ:最终统治了所有的语言!
    浅谈代码段加密原理(防止静态分析)
    HashTable、HashSet和Dictionary的区别(转)
    Mysql分表和分区的区别、分库分表介绍与区别
    划词高亮功能的实现附带开源代码
    十个推荐使用的 Laravel 的辅助函数
  • 原文地址:https://www.cnblogs.com/xiu619544553/p/5845978.html
Copyright © 2011-2022 走看看