object-c的對象模型

類的對象模型組成

1.在runtime.h找到Class和objct的定義

typedef struct objc_class *Class;

/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
}*id;

可以看出class 和id都是一個Class的結(jié)構(gòu)體,下面讓我來看下class結(jié)構(gòu)體有哪些結(jié)構(gòu)

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

上面的可以看出class包含了兩個主要的對象isa, super
類的實(shí)例對象(instace object)指向類對象(class)。類對象(class)的isa指針指向類結(jié)構(gòu)稱為元類(metaclass),元類保存類的static成員變量和static方法(+開頭的方法),實(shí)例對象中的isa指向類對象(普通的class),
該結(jié)構(gòu)存儲了普通成員變量與普通的成員方法(-開頭的方法)。

繼承中的子類,父類,根類的關(guān)系

  • 規(guī)則1: 類的實(shí)例對象is指向該類,該類的isa指向該類的元類(metaclass)
  • 規(guī)則2: 類的super_class執(zhí)行該類,如果該類為根類(nsobject)則值為NULL
  • 規(guī)則3: metaclass的isa指向根類的metaclass,如果該類為根類(nsobjct)則指向本身
  • metaclass的super_class指向父metaclass,如果該metaclass是根metaclass則指向metaclass對應(yīng)的類

例子,child-->father-->nsobject,對象的關(guān)系圖如下

Paste_Image.png

class的結(jié)構(gòu)變量

  1. objc_ivar_list *ivars 該類是class普通類保存普通成員變量,是metaclass保存類的static成員變量
  2. objc_method_list **methodLists,該類是class普通類是成員方法(-開頭方法),是metaclass類方法(方法)
  3. objc_cache *cache,用于存儲最近調(diào)用的方法緩存,下次調(diào)用直接使用,不用再遍歷查找

class的方法的重寫和尋址

  1. methodLists保存了成員方法,如果該類是子類,并且重寫了父類方法,重寫方法會在此列表中。子類調(diào)用方法時,會在cache中查找,找到該方法的緩存,直接返回imp, 如果沒找到去類的methodLists的列表找,如果能找到,返回,并加入cache,如果找不到就會往superclass的methodLists方法中尋找,往上遞推。找不到就進(jìn)入到動態(tài)決策,和消息轉(zhuǎn)發(fā)

+ (void)initialize方法調(diào)用層級

Paste_Image.png
IMP _class_lookupMethodAndLoadCache3(id obj, SEL sel, Class cls)
{
// 根類的id,nsojbet ,sel =alloc, cls = 自己類本身
    return lookUpImpOrForward(cls, sel, obj, 
                              YES/*initialize*/, NO/*cache*/, YES/*resolver*/);
}

runtime的cache機(jī)制

為了加速消息發(fā)送的進(jìn)程,runtime緩存了selector和曾經(jīng)使用的方法實(shí)現(xiàn)的映射。每個類都有自己的緩存,它能緩存selector和祖先類中的方法實(shí)現(xiàn)映射。在查找派發(fā)表之前,消息發(fā)送系統(tǒng)會先檢查接收者的緩存(理論上說,用過的方法實(shí)現(xiàn),不久會再用到)。如果緩存命中,則消息發(fā)送幾乎和函數(shù)調(diào)用一樣快。一旦程序運(yùn)行時間足夠長,緩存有了充足的“熱身”【warm up】,那么幾乎所有的查找都能在緩存中完成。隨著程序的運(yùn)行,緩存也會不斷添加新的映射。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容