iOS_例項、類、元類、基類之間的關係+結構體
阿新 • • 發佈:2021-01-06
技術標籤:iOS基礎objective-cios
isa指標
OC中任何類的定義都是物件,任何物件都有isa指標。isa是一個Class型別的指標。
例項的isa指標,指向類;
類的isa指標,指向元類;
元類的isa指標,指向根元類;
父元類的isa指標,也指向根元類!!
根元類的isa指標,指向它自己!!
superClass
類的superClass指向父類;
父類的superClass指向根類;
根類的superClass指向nil;
元類的superClass指向父元類;
父元類的superClass指向根元類;
根元類的superClass指向根類!!!!
-
分類不能新增例項變數的原因?
分類是在依賴runtime載入的。而此時類的記憶體分佈已經確定
(若此時再修改分佈情況,對程式設計性語言是災難,是不允許的) -
傳送訊息的查詢過程?
沿著isa指標的方向查詢
物件的結構體
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY; // 指向類物件
};
類的結構體
objc/runtime.h 中 objc_class 結構體的定義:
struct objc_class {
Class _Nonnull isa; // 指向元類
// 以下 OBJC2_UNAVAILABLE
Class _Nullable super_class; // 父類
const char * _Nonnull name; // 類名
long version; // 類的版本資訊,預設為0
long info; // 類資訊,供執行期使用的一些標識
long instance_size; // 該類例項變數大小
struct objc_ivar_list * _Nullable ivars; // 該類成員變數陣列
struct objc_method_list * _Nullable * _Nullable methodLists; // 方法陣列
struct objc_cache * _Nonnull cache; // 方法快取
struct objc_protocol_list * _Nullable protocols; // 協議陣列
};
分類的結構體
objc/runtime.h 中 objc_category 結構體的定義:
struct objc_category { // OBJC2_UNAVAILABLE
char * _Nonnull category_name;
char * _Nonnull class_name;
struct objc_method_list * _Nullable instance_methods;
struct objc_method_list * _Nullable class_methods;
struct objc_protocol_list * _Nullable protocols;
}