Objective c 为什么objc_类在runtime.h和objc runtime new.h之间有不同的定义
我的难题是编译器如何编译这两个同名结构 开放给开发人员的objc/runtime.h中的objc_类定义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
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。我已经有一段时间没有研究运行时是如何构建的了。