iOS-對象模型的理解

前言objective-c

在oc中,類的實例稱爲對象,類其實也是對象。類還分包含了實體類和元類,對象的isa指針指向的是實體類,類對象的isa指針指向的是元類;因此類對象訪問的類方法應該是存放在元類中的。指針

 

(1)在底層對象表現爲結構體,typedef struct objc_object {對象

Class isa內存

} *id;開發

其中有一個指向類的isa指針,這個決定了對象所屬的類類型。對象能發送消息,也是經過此isa指針去逐層的遍歷類的方法列表,而後找到需執行的方法的。io

 

(2)既然對象有isa指針,並經過isa尋找方法,類對象也能夠發送消息,那麼類對象確定也有isa指針,才能發送消息。在底層類表現的結構體typedef struct objc_class{class

Class isa;變量

#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;
#endifobject

} OBJC2_UNAVAILABLE;List

咱們看到的是,類對象除了有isa指針外,頗有不少其餘的屬性,好比類名、父類、實例大小等。**methodLists這個二級指針,保存的是方法列表的首地址,經過修改這個指針指向的指針的內容,就能夠動態的爲類添加方法了,category應該就是這樣爲類添加方法的。而結構體的實例大小是不可變的,因此category沒法添加實例變量,只能經過runtime關聯變量,這兩個機制不同,不會改變類的內存分佈。

 

總結

更多的瞭解對象模型,能夠更好的objective-c的運行時,也能夠理解類的內部機制,明確對象如何發送消息,類對象如何發送消息的邏輯;也瞭解到了類包含實體類和元類,對象的isa指針指向實體類,類對象的isa指針指向元類,從而纔有了咱們在實際開發過程當中,經過類的實例訪問實例方法,經過類名訪問類方法這一邏輯。也進一步的瞭解了,category這個強大的機制爲何能夠添加方法,爲何不能夠添加實例變量的,經過對象模型的理解,都會有很好的啓示。

相關文章
相關標籤/搜索