日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言的class,Objective-C中Class的本质

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的本质的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。