zoukankan      html  css  js  c++  java
  • 实例对象( instance)、类对象(class)、元类对象(meta-class)的内部结构分析

    实例对象( instance)、类对象(class)、元类对象(meta-class)的内部结构分析

    本文使用的objc源码版本为objc4-756.2

    Class本质上为一个结构体类型

    typedef struct objc_class *Class;

    实例对象的定义

    struct objc_object {
    private:
        isa_t isa;    
        //以下省略是其他继承添加成员变量
    }

    类对象/元类对象的定义

    struct objc_class : objc_object {
        // Class ISA;
        Class superclass;
        cache_t cache;             // 方法缓存
        class_data_bits_t bits;    // 类的具体信息
        class_rw_t *data() { 
            return bits.data();
    }
        //以下省略
    }
    
    struct class_rw_t {
        // Be warned that Symbolication knows the layout of this structure.
        uint32_t flags;
        uint32_t version;
    
        const class_ro_t *ro;
    
        method_array_t methods;    //方法列表
        property_array_t properties;    //属性信息
        protocol_array_t protocols;    //协议列表
    }
    
    struct class_ro_t {
        uint32_t flags;
        uint32_t instanceStart;
        uint32_t instanceSize;    //instance对象占用的内存大小
    #ifdef __LP64__
        uint32_t reserved;
    #endif
    
        const uint8_t * ivarLayout;
        
        const char * name;    //类名
        method_list_t * baseMethodList;
        protocol_list_t * baseProtocols;
        const ivar_list_t * ivars;    //成员变量列表
    
        const uint8_t * weakIvarLayout;
        property_list_t *baseProperties;
    }

    Xcode 里面的runtime里面的 API是已经废弃了如下

    /// An opaque type that represents an Objective-C class.
    typedef struct objc_class *Class;
    
    /// Represents an instance of a class.
    struct objc_object {
        Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
    };

    废弃如下  OBJC2_UNAVAILABLE; 

    struct objc_class {
        Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
    
    #if !__OBJC2__
        Class _Nullable super_class                              OBJC2_UNAVAILABLE;
        const char * _Nonnull name                               OBJC2_UNAVAILABLE;
        long version                                             OBJC2_UNAVAILABLE;
        long info                                                OBJC2_UNAVAILABLE;
        long instance_size                                       OBJC2_UNAVAILABLE;
        struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
        struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
        struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
        struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
    #endif
    
    } OBJC2_UNAVAILABLE;
  • 相关阅读:
    使用jquery的get,ajax,post三种方式实现ajax效果
    在javascript中Json字符串的解析
    (转)C#发送邮件及附件
    jQuery的combobox绑定失去焦点blur事件
    windows2008R2 x64位架设IIS7.x的支持SQLServer2008的PHP服务器
    PyCharm的几个常用设置
    转: 震惊小伙伴的单行代码 Python篇
    virtualBox安装Ubuntu16.4遇到的问题解决办法
    PHP里面把16进制的图片数据显示在html的img标签上
    转:Python:sitecustomize 和 usercustomize
  • 原文地址:https://www.cnblogs.com/junhuawang/p/13573262.html
Copyright © 2011-2022 走看看