objectiveC對象模型 - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不管是網站(zhàn),軟件還是小程序,都要直接或間接能為您産生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站(zhàn)成為營銷工具,讓軟件能切實提升企業(yè)内部管理水平和(hé)效率。優秀的程序為後期升級提供便捷的支持!

您當前位置>首頁 » 新聞資(zī)訊 » 技術(shù)分享 >

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 去查找

相關(guān)案例查看更多