Runtime(二)

Crazy巴旦木發表於2018-08-08

Method 是方法的型別, typedef struct objc_method *Method;

struct objc_method {

SEL method_name OBJC2_UNAVAILABLE;

char *method_types OBJC2_UNAVAILABLE;

IMP method_imp OBJC2_UNAVAILABLE;

}

objc_method 儲存了方法的方法名(SEL method_name,相同名字的方法即使在不同類中定義,它們的方法選擇器也相同。),方法型別(char *method_types, char指標其實儲存著方法的引數型別和返回值型別)和方法實現(IMP method_imp)。

Ivar 是例項變數型別。typedef struct objc_ivar *Ivar;

objc_ivar 包含了變數名稱(char *ivar_name),變數型別(char *ivar_type),基地址偏移位元組(int ivar_offset)

struct objc_ivar {

char *ivar_name OBJC2_UNAVAILABLE;

char *ivar_type OBJC2_UNAVAILABLE;

int ivar_offset OBJC2_UNAVAILABLE;

#ifdef LP64

int space OBJC2_UNAVAILABLE;

#endif

}

class_copyIvarList函式獲取的不僅有例項變數,還有屬性。但會在原本的屬性名前加上一個下劃線。

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

當你發起Objc訊息,由這個函式指定執行程式碼。這個函式的指標指向了方法的實現。

Cache typedef struct objc_cache *Cache;

Cache為方法呼叫的效能進行優化,當例項物件收到訊息時優先訪問cache,找不到再去isa指向的類的方法列表遍歷查詢,找到後放到cache中。

Property 指向objc_property結構體

typedef struct objc_property *Property;

typedef struct objc_property *objc_property_t;//這個更常用

可以通過class_copyPropertyList和protocol_copyPropertyList方法來獲取類和協議中的屬性:

objc_property_t *class_copyPropertyList(Class cls,unsigned int *outCount)

objc_property_t *protocol_copyPropertyList(Protocol *proto,unsigned int *outCount)

返回型別為指向指標的指標,哈哈,因為屬性列表是個陣列,每個元素內容都是一個objc_property_t指標,而這兩個函式返回的值是指向這個陣列的指標。

class_copyPropertyList 獲取屬性列表

property_getName函式來查詢屬性名稱 :

const char *property_getName(objc_property_tproperty)

你可以用class_getProperty和protocol_getProperty通過給出的名稱來在類和協議中獲取屬性的引用:

objc_property_t class_getProperty(Class cls,const char *name)

objc_property_t protocol_getProperty(Protocol proto,const charname, BOOL isRequiredProperty, BOOL isInstanceProperty)

用property_getAttributes函式來發掘屬性的名稱和@encode型別字串:

const char *property_getAttributes(objc_property_tproperty)

class_copyIvarList函式,使用class_copyPropertyList函式只能獲取類的屬性,而不包含成員變數。但此時獲取的屬性名是不帶下劃線的。

相關文章