前言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這個強大的機制爲何能夠添加方法,爲何不能夠添加實例變量的,經過對象模型的理解,都會有很好的啓示。