/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// A pointer to an instance of a class.
typedef struct objc_object *id;
Class
是一個指向objc_class(類)
結構體的指針,而id
是一個指向objc_object(對象)
結構體的指針。
objc_object(對象)
中isa
指針指向的類結構稱為objec_class(該對象的類)
,其中存放著普通成員變量與對象方法 (“-”開頭的方法)。
objc_class(類)
中isa指針指向的類結構稱為metaclass(該類的元類)
,其中存放著static類型的成員變量與static類型的方法 (“+”開頭的方法)。
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
objc_objct(對象)
結構體中只有isa
一個成員屬性,指向objc_class(該對象的類)
。
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY; //isa指針,指向metaclass(該類的元類)
#if !__OBJC2__
Class super_class //指向objc_class(該類)的super_class(父類)
const char *name //objc_class(該類)的類名
long version //objc_class(該類)的版本信息,初始化為0,可以通過runtime函數class_setVersion和class_getVersion進行修改和讀取
long info //一些標識信息,如CLS_CLASS表示objc_class(該類)為普通類。ClS_CLASS表示objc_class(該類)為metaclass(元類)
long instance_size //objc_class(該類)的實例變量的大小
struct objc_ivar_list *ivars //用于存儲每個成員變量的地址
struct objc_method_list **methodLists //方法列表,與info標識關聯
struct objc_cache *cache //指向最近使用的方法的指針,用于提升效率
struct objc_protocol_list *protocols //存儲objc_class(該類)的一些協議
#endif
} OBJC2_UNAVAILABLE;
objc_class(類)
比objc_object(對象)
的結構體中多了很多成員,上面就是介紹各個成員的作用。
值得注意的是:
所有的metaclass(元類)
中isa
指針都是指向根metaclass(元類)
,而根metaclass(元類)
中isa
指針則指向自身。
根metaclass(元類)
中的superClass指針指向根類,因為根metaclass(元類)
是通過繼承根類產生的。
作用:
當我們調用某個對象的對象方法時,它會首先在自身isa
指針指向的objc_class(類)
的methodLists
中查找該方法,如果找不到則會通過objc_class(類)
的super_class指針
找到其父類,然后從其methodLists
中查找該方法,如果仍然找不到,則繼續通過 super_class
向上一級父類結構體中查找,直至根class
;
當我們調用某個類方法時,它會首先通過自己的isa
指針找到metaclass(元類)
,并從其methodLists
中查找該類方法,如果找不到則會通過metaclass(元類)
的super_class
指針找到父類的metaclass(元類)
結構體,然后從methodLists
中查找該方法,如果仍然找不到,則繼續通過super_class
向上一級父類結構體中查 找,直至根metaclass(元類)
;
這里有個細節就是要說運行的時候編譯器會將代碼轉化為objc_msgSend(obj, @selector (makeText))
,在objc_msgSend
函數中首先通過obj(對象)
的isa
指針找到obj(對象)
對應的class(類)
。在class(類)
中先去cache
中通過SEL(方法的編號
)查找對應method(方法)
,若cache
中未找到,再去methodLists
中查找,若methodists
中未找到,則去superClass
中查找,若能找到,則將method(方法)
加入到cache
中,以方便下次查找,并通過method(方法)
中的函數指針跳轉到對應的函數中去執行。
最后編輯于 :2017.12.08 02:30:04
?著作權歸作者所有,轉載或內容合作請聯系作者 平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。