objectiveC對象模型
發表時間:2020-10-19
發布人:葵宇科技
浏覽次數:34
第一、在OC中(zhōng)關(guān)于對象模型,有五個(gè)根本概念,Object(實例),Class(類),Metaclass(元類),Rootclass(根類),Rootclass‘s metaclass(根元類)
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
第三、每個(gè)class構造如(rú)下(xià)所示:
struct objc_class {
規矩三:metaclass 的 isa 指向根 metaclass,如(rú)不雅該 metaclass 是根 metaclass 則指向自身;
規矩一:類的實例對象的 isa 指向該類;該類的 isa 指向該類的 metaclass;
struct objc_class * isa;
struct objc_class * super_class; /*父類*/
const char *name; /*類名字*/
long version; /*版本信息*/
long info; /*類信息*/
long instance_size; /*實例大年夜小*/
struct objc_method_list **methodLists; /*辦法鍊表*/
struct objc_cache *cache; /*辦法緩存*/
規矩二:類的 super_class 指向其父類,如(rú)不雅該類為根類則值為 NULL;
struct objc_protocol_list *protocols; /*協定鍊表*/
};
各個(gè)字段解析:
1、name:一個(gè) C 字符串,指導類的名稱。我們可(kě)以在運行期,經由過程這個(gè)名稱查找到該類(經由過程:id objc_getClass(const char *aClassName))或該類的 metaclass(id objc_getMetaClass(const char *aClassName));
第二、每一個(gè)object都有一個(gè)隐蔽的isa指針,指向class,對象構造如(rú)下(xià)所示:
2、version:類的版本信息,默認初始化為 0。我們可(kě)以在運行期對其進行修改(class_setVersion)或獲取(class_getVersion)。
3、info:供運行期應用的一些位标識。有如(rú)下(xià)一些位掩碼:
CLS_CLASS (0x1L) 表示該類為通(tōng)俗 class ,個(gè)中(zhōng)包含實例辦法和(hé)變量;
CLS_META (0x2L) 表示該類為 metaclass,個(gè)中(zhōng)包含類辦法;
CLS_INITIALIZED (0x4L) 表示該類已經被運行期初始化了,這個(gè)标識位隻被 objc_addClass 所設置;
CLS_POSING (0x8L) 表示該類被 pose 成其他的類;(poseclass 在ObjC 2.0中(zhōng)被放棄了);
CLS_MAPPED (0x10L) 為ObjC運行期所應用
CLS_FLUSH_CACHE (0x20L) 為ObjC運行期所應用
CLS_GROW_CACHE (0x40L) 為ObjC運行期所應用
CLS_NEED_BIND (0x80L) 為ObjC運行期所應用
CLS_METHOD_ARRAY (0x100L) 該标記位指導 methodlists 是指向一個(gè) objc_method_list 照樣一個(gè)包含 objc_method_list 指針的數組;
4、instance_size:該類的實例變量大年夜小(包含大年夜父類持續下(xià)來的實例變量);
5、ivars:指向 objc_ivar_list 的指針,存儲每個(gè)實例變量的内存地址,如(rú)不雅該類沒有任何實例變量則為 NULL;
6、methodLists:與 info 的一些标記位有關(guān),CLS_METHOD_ARRAY 标識位決定其指向的器(qì)械(是指向單個(gè) objc_method_list照樣一個(gè) objc_method_list 指針數組),如(rú)不雅 info 設置了 CLS_CLASS 則 objc_method_list 存儲實例辦法,如(rú)不雅設置的是 CLS_META 則存儲類辦法;
7、cache:指向 objc_cache 的指針,用來緩存比來應用的辦法,以進步效力;
8、protocols:指向 objc_protocol_list 的指針,存儲該類聲明要遵守的┞俘式協定。
class中(zhōng)也有一個(gè)isa指針, 該指針指向類構造被稱作 metaclass
第四、object/class/metaclass指向關(guān)系知足如(rú)下(xià)規矩
struct objc_ivar_list *ivars; /*實例參數鍊表*/
規矩四:metaclass 的 super_class 指向父 metaclass,如(rú)不雅該 metaclass 是根 metaclass 則指向該 metaclass 對應的類;
圖解如(rú)下(xià)所示:
[img]http://img.blog.csdn.net/20150106150738804?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmljaGFyZF9ydWZlbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
第六、class與metaclass的差别
metaclass 存儲類的static類成員變量與static類成員辦法(+開首的辦法);實例對象中(zhōng)的 isa 指向類構造稱作 class(通(tōng)俗的),class 構造存儲類的通(tōng)俗成員變量與通(tōng)俗成員辦法(-開首的辦法)
class 是 instance object 的類類型。當我們向實例對象發送消息(實例辦法)時,我們在該實例對象的 class 構造的 methodlists 中(zhōng)去查找響應的函數,如(rú)不雅沒找到匹配的響應函數則在該 class 的父類中(zhōng)的 methodlists 去查找。
metaclass 是 class object 的類類型。當我們向類對象發送消息(類辦法)時,我們在該類對象的 metaclass 構造的 methodlists 中(zhōng)去查找響應的函數,如(rú)不雅沒有找到匹配的響應函數則在該 metaclass 的父類中(zhōng)的 methodlists 去查找