1. 程式人生 > 其它 >iOS_例項、類、元類、基類之間的關係+結構體

iOS_例項、類、元類、基類之間的關係+結構體

技術標籤: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;
}