c语言的class,Objective-C中Class的本质
類(class)和元類(meta-class)底層都是 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;
之前沒有注意到 OBJC2_UNAVAILABLE(眼瞎啊!!!),最近才注意到,這部分結構體已經棄用了,那新的是什么樣?有變化嗎?變化大嗎?抱著這些問題,一起往下看。
源碼下載地址
注意:因源碼結構體太長,以下是部分截取
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 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);
}
發現這里是一個繼承關系,objc_class 繼承自 objc_object,先放放,后面會提到。
這里的 superclass 和 cache,很容易看明白,可是 class_rw_t 是什么?
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; // 協議列表
此結構體存放著我們熟悉的 方法列表、屬性列表、協議列表 等。
那 const class_ro_t *ro; 這個又是什么鬼?
struct class_ro_t {
uint32_t flags;
uint32_t instanceStart;
uint32_t instanceSize; // 事例對象大小
#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;
method_list_t *baseMethods() const {
return baseMethodList;
}
};
此結構體存放著 實例對象大小、類名、成員變量 等。
objc-private.h文件中
struct objc_object {
private:
isa_t isa;
public:
// ISA() assumes this is NOT a tagged pointer object
Class ISA();
// getIsa() allows this to be a tagged pointer object
Class getIsa();
isa 指針出現了,看到這就明白了,因為 objc_class 繼承自 objc_object,所以 objc_class 也擁有 isa 指針。
總結
以上是生活随笔為你收集整理的c语言的class,Objective-C中Class的本质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【托马斯微积分】(12版)阅读笔记1:函
- 下一篇: DY共轭梯度法