Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么objc_类在runtime.h和objc runtime new.h之间有不同的定义_Objective C_Runtime - Fatal编程技术网

Objective c 为什么objc_类在runtime.h和objc runtime new.h之间有不同的定义

Objective c 为什么objc_类在runtime.h和objc runtime new.h之间有不同的定义,objective-c,runtime,Objective C,Runtime,我的难题是编译器如何编译这两个同名结构 开放给开发人员的objc/runtime.h中的objc_类定义 struct objc_class { Class _Nonnull isa OBJC_ISA_AVAILABILITY; #if !__OBJC2__ Class _Nullable super_class OBJC2_UNAVAILABLE; const char * _Nonnull name

我的难题是编译器如何编译这两个同名结构

开放给开发人员的objc/runtime.h中的objc_类定义

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);
    }

    …

    …

};

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

一个是从代码中使用运行时时看到的。另一个是运行时内部使用的实现细节

请注意,在这两种情况下,第一个插槽都是isa,尽管objc runtime new.h有效地从objc_对象继承了该插槽,第二个插槽是超类


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

一个是从代码中使用运行时时看到的。另一个是运行时内部使用的实现细节

请注意,在这两种情况下,第一个插槽都是isa,尽管objc runtime new.h有效地从objc_对象继承了该插槽,第二个插槽是超类


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

如果!在OBJC/runtime.h文件顶部定义的OBJC_类型。而在OBJC-private.h中定义的OBJC_类型。因此,不使用OBJC/runtime.h中的OBJC_类定义。

如果!在OBJC/runtime.h文件顶部定义的OBJC_类型,以及在OBJC-private.h中定义的OBJC_类型,因此没有使用OBJC/runtime.h中的OBJC_类定义。

我不确定是否有人能在不读你的心思的情况下回答这个问题。假设我们对这个问题一无所知,你能详细解释一下吗?@SteveFriedl我添加了一些描述。上面的代码是苹果的开源代码,我不知道同一个项目中的同名结构有不同的结构。我不确定没有人能不读你的心思就回答这个问题。假设我们对这个问题一无所知,你能详细解释一下吗?@SteveFriedl我补充了一些描述。上面的代码是苹果的开源代码,我不知道同一个项目中的同名struct具有不同的结构。谢谢。这是否意味着运行时项目只包含objc runtime new.h,而开发者只能包含runtime.h,所以不存在重新定义错误?@aprict最有可能。我已经有一段时间没看运行时是如何构建的了。谢谢。这是否意味着运行时项目只包含objc runtime new.h,而开发者只能包含runtime.h,所以不存在重新定义错误?很可能是@aprict。我已经有一段时间没有研究运行时是如何构建的了。