Objective-C 源碼(一):對象模型

    

    首先,你要先弄清楚什麼是類,什麼是對象。(爲了說清楚這個問題,先舉個栗子:類—>對象—>實例:人類是類;某我的是對象;你是實例;實例自己也是對象。這下基本能理解其中的差異了,要是仍是搞不清楚,本身去google一下吧。)佈局

   對象google

    在Objective-C中,每個對象都是某個類的實例,且這個對象的isa指針指向它所屬的類。打開 objc-private.h文件,在第126行能夠看到 Objective-C 對象的定義struct objc_object Objective-C中對象本質上是結構體對象,其中isa是它的惟一私有變量。spa

    一樣的,在第48行到第52行,能夠找到 Class 和 id 類型定義,這也是爲何 id類型能夠指向任意對象的緣由。其中objc_class 就是 Objective-C 中類的定義。指針

    
對象

對象的類不只描述了對象的數據:對象佔用內存大小,成員變量的類型佈局等,還描述了對象的行爲:對象能響應的信息,實現的實力方法(不少對runtime的講解的文章,其實就是在這一塊作文章)等。所以,當咱們調用[receiver message]給一個對象發送消息的時候,這個對象可否響應這個消息就須要經過isa找到它所屬的類(包括superClass)才能知道。繼承

    打開 objc-runtime-new.h ,在687行能夠找到 Objective-C 中 struct objc_class 的定義。能夠看到Objective-C中類也是一個結構體對象,而且繼承了 struct objc_object 內存

    因此: Objective-C 中的類本質上也是對象,咱們稱之爲類對象。按照以前說的,全部的對象都是某個類的實例,那麼類對象又是什麼什麼類的實例,這是個值得思考的問題。io

    咱們知道 Objective-C 中有一個很是特殊的NSObject,絕大部分的類都繼承自它,它是 Objective-C 中兩個rootClass鐘的一個,另外一個是NSProxy(另外一篇文章有)。打開 NSObject.h ,能夠看到NSObject 類就只有一個成員變量 isa, 全部繼承自NSObject得類也都會有這個成員變量。class

     元類變量

    本質上講, Objective-C 中的類也是對象,它也是某個類的實例,這個類咱們稱之爲元類(metaclass)。

    所以,咱們能夠調用類方法,好比[NSObject new]來給類對象發送消息。一樣的,類對象可否響應這個消息,要經過isa找到類對象所屬的類(元類)才能知道。也就是說,實例方法保存在類中,而類方法保存在元類中。

    元類也是對象(元類對象),元類也是某個類的實例,這個類咱們稱之爲根元類(root metaclass)。特殊的是:全部的元類所屬的類都是同一個根元類(固然根元類也是元類,因此它所屬的類也是根元類,即它自己)。根元類所指的就是根類的元類,具體說就是根類NSObject 對應的元類。

    上經典圖:經過上面的解析,再來看這張圖,清晰多了。

    

相關文章
相關標籤/搜索