iOS中不管類對象還是元類對象類型都是Class,而Class的結(jié)構(gòu)則是objc_class結(jié)構(gòu)體
typedef struct objc_class *Class;
1.OBJC1 objc_class結(jié)構(gòu)(過時)
頭文件 #import <objc/runtime.h>內(nèi)看到的objc_class結(jié)構(gòu)為:
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY; //isa指針
#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; //協(xié)議列表
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
2.OBJC2 objc_class結(jié)構(gòu)
可以在https://opensource.apple.com/source/objc4/objc4-723/中下載和查看開源的最新版本的Runtime庫源代碼巴柿。Runtime庫的源代碼是用匯編和C++混合實現(xiàn)的凛虽,你可以在頭文件objc-runtime-new.h中看到關(guān)于struct objc_class
結(jié)構(gòu)的詳細(xì)定義。
查看代碼你會發(fā)現(xiàn)广恢,objc_class繼承自objc_object凯旋,在頭文件objc-private.h中看到關(guān)于objc_object結(jié)構(gòu)的詳細(xì)定義。
因為這是通過c++實現(xiàn)的,所以結(jié)構(gòu)體內(nèi)會包含函數(shù)至非。
objc_class的結(jié)構(gòu)體內(nèi)的data反回了一個class_rw_t的結(jié)構(gòu)體指針钠署,而這個指針的結(jié)構(gòu)是:
struct class_rw_t {
uint32_t flags;
uint32_t version;
const class_ro_t *ro;
method_array_t methods;
property_array_t properties;
protocol_array_t protocols;
Class firstSubclass;
Class nextSiblingClass;
char *demangledName;
void setFlags(uint32_t set)
{
OSAtomicOr32Barrier(set, &flags);
}
void clearFlags(uint32_t clear)
{
OSAtomicXor32Barrier(clear, &flags);
}
// set and clear must not overlap
void changeFlags(uint32_t set, uint32_t clear)
{
assert((set & clear) == 0);
uint32_t oldf, newf;
do {
oldf = flags;
newf = (oldf | set) & ~clear;
} while (!OSAtomicCompareAndSwap32Barrier(oldf, newf, (volatile int32_t *)&flags));
}
};
而class_rw_t是通過bits調(diào)用data方法得來的,我們來到data方法內(nèi)部實現(xiàn)荒椭。我們可以看到谐鼎,data函數(shù)內(nèi)部僅僅對bits進(jìn)行&FAST_DATA_MASK操作
class_rw_t* data() {
return (class_rw_t *)(bits & FAST_DATA_MASK);
}
成員變量信息則是存儲在class_ro_t內(nèi)部中的,我們來到class_ro_t內(nèi)查看趣惠。
class_ro_t結(jié)構(gòu)體:
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;
}
};
class_rw_t 表示read write狸棍,class_ro_t 表示 read only。
通過以上分析可以得到objc_class的結(jié)構(gòu)類圖:
圖片最左邊顯示的內(nèi)容有一個編輯錯誤味悄,不應(yīng)該是NSObject而應(yīng)該是objc_class草戈。
文章引用鏈接:
1.http://www.reibang.com/p/df6629ec9a25
2.http://www.reibang.com/p/4f732bd01f27
文章2有證明過程,這里不再贅述