runtime

1、idclass指針

class指針只向objc_class結構體

id指針只向objc_object結構體

isa是一個指向objc_class結構體(該對象所屬的類)

id是對象,class是類

struct objc_object {

Class isaOBJC_ISA_AVAILABILITY;

};

objc_class的定義如下

typedef struct objc_class *Class;

struct objc_class {

Class isaOBJC_ISA_AVAILABILITY; // metaclass

#if !__OBJC2__

Class super_classOBJC2_UNAVAILABLE; //父類

const char *nameOBJC2_UNAVAILABLE; //類名

long versionOBJC2_UNAVAILABLE; //類的版本信息,默認為0,可以通過runtime函數class_setVersion或者class_getVersion進行修改、讀取

long infoOBJC2_UNAVAILABLE; //類信息,供運行時期使用的一些位標識,如CLS_CLASS (0x1L)表示該類為普通class,其中包含實例方法和變量;CLS_META (0x2L)表示該類為metaclass,其中包含類方法;

long instance_sizeOBJC2_UNAVAILABLE; //該類的實例變量大?。ò◤母割惱^承下來的實例變量)

struct objc_ivar_list *ivarsOBJC2_UNAVAILABLE; //該類的成員變量地址列表

struct objc_method_list **methodListsOBJC2_UNAVAILABLE; //方法地址列表,與info的一些標志位有關,如CLS_CLASS (0x1L),則存儲實例方法,如CLS_META (0x2L),則存儲類方法;

struct objc_cache *cacheOBJC2_UNAVAILABLE; //緩存最近使用的方法地址,用于提升效率;

struct objc_protocol_list *protocolsOBJC2_UNAVAILABLE; //存儲該類聲明遵守的協議的列表

#endif

}

2、SEL

SEL是selector在Objective-C中的表示類型。selector可以理解為區別方法的ID。

typedef struct objc_selector *SEL;

struct objc_selector {

char *name;OBJC2_UNAVAILABLE;//名稱

char *types;OBJC2_UNAVAILABLE;//類型

};

3IMP

typedef id (*IMP)(id, SEL, ...);

IMP是“implementation”的縮寫,它是由編譯器生成的一個函數指針。當你發起一個消息后(下文介紹),這個函數指針決定了最終執行哪段代碼。

4Method

Method代表類中的某個方法的類型。

typedef struct objc_method *Method;

struct objc_method {

SEL method_nameOBJC2_UNAVAILABLE; //方法名

char *method_typesOBJC2_UNAVAILABLE; //方法類型

IMP method_impOBJC2_UNAVAILABLE; //方法實現

}

方法名method_name類型為SEL,

方法類型method_types是一個char指針,存儲著方法的參數類型和返回值類型。

方法實現method_imp的類型為IMP

5、Ivar

Ivar代表類中實例變量的類型

typedef struct objc_ivar *Ivar;

struct objc_ivar {

char *ivar_nameOBJC2_UNAVAILABLE; //變量名

char *ivar_typeOBJC2_UNAVAILABLE; //變量類型

int ivar_offsetOBJC2_UNAVAILABLE; //基地址偏移字節

#ifdef __LP64__

int spaceOBJC2_UNAVAILABLE; //占用空間

#endif

}

6、objc_property_t

objc_property_t是屬性,它的定義如下:

typedef struct objc_property *objc_property_t;

objc_property是內置的類型,與之關聯的還有一個objc_property_attribute_t,它是屬性的attribute,也就是其實是對屬性的詳細描述,包括屬性名稱、屬性編碼類型、原子類型/非原子類型等。它的定義如下:

typedef struct {

const char *name; //名稱

const char *value;//值(通常是空的)

} objc_property_attribute_t;

7、Cache

Catch的定義如下:

typedef struct objc_cache *Cache

struct objc_cache {

unsigned int maskOBJC2_UNAVAILABLE;

unsigned int occupiedOBJC2_UNAVAILABLE;

Method buckets[1]OBJC2_UNAVAILABLE;

};

mask:指定分配cache buckets的總數。在方法查找中,Runtime使用這個字段確定數組的索引位置。

occupied:實際占用cache buckets的總數。

buckets:指定Method數據結構指針的數組。這個數組可能包含不超過mask+1個元素。需要注意的是,指針可能是NULL,表示這個緩存bucket沒有被占用,另外被占用的bucket可能是不連續的。這個數組可能會隨著時間而增長。

objc_msgSend(下文講解)每調用一次方法后,就會把該方法緩存到cache列表中,下次的時候,就直接優先從cache列表中尋找,如果cache沒有,才從methodLists中查找方法。

8、Catagory

這個就是我們平時所說的類別了。它可以動態的為已存在的類添加新的方法

typedef struct objc_category *Category;

struct objc_category {

char *category_nameOBJC2_UNAVAILABLE; //類別名稱

char *class_nameOBJC2_UNAVAILABLE; //類名

struct objc_method_list *instance_methodsOBJC2_UNAVAILABLE; //實例方法列表

struct objc_method_list *class_methodsOBJC2_UNAVAILABLE; //類方法列表

struct objc_protocol_list *protocolsOBJC2_UNAVAILABLE; //協議列表

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 我們常常會聽說 Objective-C 是一門動態語言,那么這個「動態」表現在哪呢?我想最主要的表現就是 Obje...
    Ethan_Struggle閱讀 2,230評論 0 7
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,757評論 0 9
  • 前言 runtime其實在我們日常開發過程中很少使用到,尤其是像我現在比較初級的程序猿就更用不到了。但是去面試很多...
    WolfTin閱讀 652評論 0 2
  • 本文詳細整理了 Cocoa 的 Runtime 系統的知識,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 821評論 0 4
  • runtime 運行時語言,實現Object-C的C語言庫,將OC轉換成C進行編譯的過渡者。 作為一門動態編程語言...
    夜雨聲煩_閱讀 556評論 0 0