【问题标题】:Why objc_class has different definition between runtime.h and objc-runtime-new.h为什么 objc_class 在 runtime.h 和 objc-runtime-new.h 之间有不同的定义
【发布时间】:2020-06-16 11:56:55
【问题描述】:

我的困惑是编译器如何编译这两个同名结构。

对开发者开放的“objc/runtime.h”中的objc_class定义

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;
/* Use `Class` instead of `struct objc_class *` */

但是项目头文件“objc-runtime-new.h”有不同的定义(成员变量和函数)。

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    // class_data_bits_t 
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() {

        return bits.data();
    }
    void setData(class_rw_t *newData) {
        bits.setData(newData);
    }

    …

    …

};

我不明白这两个结构是如何转换的。

【问题讨论】:

  • 我不确定是否有人能在不读懂你的想法的情况下回答这个问题。假设我们对此问题一无所知,您能否详细说明一下?
  • @SteveFriedl 我添加一些描述。上面的代码是Apple开源代码,我不知道同一个项目中的同名结构具有不同的结构。

标签: objective-c runtime


【解决方案1】:

“objc/runtime.h”文件顶部有“#if !OBJC_TYPES_DEFINED”。“objc-private.h”中定义了“OBJC_TYPES_DEFINED”。所以“objc/runtime.h”中的objc_class定义是没用过。

【讨论】:

    【解决方案2】:

    其中一个是您在代码中使用运行时时所看到的。另一个是运行时在内部用作实现细节。

    请注意,在这两种情况下,第一个插槽是isa(尽管objc-runtime-new.h 实际上从objc_object 继承了该插槽),第二个插槽是superclass

    这是唯一可以从运行时外部访问的两个插槽。在运行时内部,该结构具有更多与类关联的其余元数据的条目。

    【讨论】:

    • thanks.是不是说runtime项目只包含objc-runtime-new.h,开发者只能包含runtime.h,所以不存在重定义错误?
    • @apricot 很有可能。我已经有一段时间没有研究运行时是如何构建的了。
    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 2014-06-13
    • 2018-07-27
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多