標籤:
Objective-C葵花寶典第一重(內功篇)--類與對象
轉自:http://husbandman.diandian.com/post/2012-08-17/40036035008
Objective-C葵花寶典第一重(內功篇)–類與對象
切記:欲練神功,揮刀自宮;煉丹服藥,內外齊通。
今練氣之道,不外存想導引,渺渺太虛,天地分清濁而生人,人之練氣,不外練虛靈而滌蕩昏濁,氣者命之主,形者體之用。天地可逆轉,人亦有男女互化之道,此中之道,切切不可輕傳。修鍊此功,當先養心,令心不起雜念,超然於物外方可,若心存雜念,不但無功,反而有性命之憂。
概述
對象
Objective-C中,類和對象的底層資料結構,可以參考Objective-C底層資料結構.
其中對象是通過struct objc_object結構實現
typedef struct objc_object *id;
對象在運行時候,會產生如的結構形式
我們把這個轉換成種更容易理解的資料群組織形式
真正的記憶體形式是這樣的
從對象記憶體形式上來看.對象內的變數成員,是從祖類繼承而來(子成父業啊),在對象內部產生副本.從對象的記憶體組織來看,對象本身並不關心行為(對象的方法或執行個體方法),重點都在資料的組織上.
(_) _____ ____ _
/ / / ___/ / __ `/
/ / (__ ) / /_/ /
/_/ /____/ \__,_/
對象的都有一個isa執行個體變數,它是從繼承層次最高的NSObject繼承而來.isa是表示對象的關鍵.在Objective-C中,是不是第一等對象,isa就是其標誌,就好像<變形金剛>中的汽車人都有一個
如果你發現的鐵傢伙是這個標誌
那你就趕緊逃命去吧~
isa是一個指標,指向了該對象的類.實質上,同一個類的執行個體,都指向同一個類對象(類也是一種特殊對象).類中包含了執行個體方法,也就是說,同一個類的所有執行個體共用了這些執行個體方法.訊息就是發送給對象,對象轉交給其isa指向類去處理.這種現象類似於當下火熱的雲端運算.
雲雞一算,要風得風,要雨得雨
Objective-C的這種設計,既可以友好地實現物件導向,又可以有效地節約記憶體.降低冗餘資料.對象對方法的調用是通過isa間接去調用,這樣就造成了方法調用的動態性,主要原因是:
一個對象並不曉得它能否應答一個方法,它本身既不包含方法的實現,也不包含有方法的指標,而是間接通過isa轉到自己的類才能知道
類中的執行個體方法是以鏈表形式存在,運行時候,可以修改鏈表中的執行個體方法,即可以增刪改查,這與C中的函數預設都是extern的不同
從上面的分析,isa的意義就更加重大,倘若沒有isa,一個對象就跟char,int類型等沒啥區別了,不具備回應訊息的本領.所以說,isa是什麼,就好比是古時候官員的烏紗帽,有烏紗帽,就有權力,烏紗帽沒了,就是凡夫俗子
類
類是通過struct objc_class結構實現的,
typedef struct objc_class *Class;
在運行時,將會產生如這樣的結構
在Objective-C的世界裡,一看到isa的第一個反應就是,咦,對象.是的,Objective-C中的類其實也是一種對象.
天地不仁,以萬物為芻狗<道德經>
既然天地生的萬物,那麼天地又是何物?
如果人類是上古神仙女媧所造,那女媧又因何而生呢?
一般程式語言,對象的盡頭都是自己生了自己.自己下個蛋,爬出來了自己.似乎是悖逆的,但確實如此.作為根類的NSObject就是這樣一個傢伙!
這看起來確實很困惑,但是譬如生物學中的造血幹細胞可謂細胞的製造廠,但是造血幹細胞又是誰製造的呢,咦,也是造血幹細胞
首先,類對象也是一種對象,那麼它也會有自己的行為,這種行為稱作類方法.與一般的類執行個體一樣,類對象也不具備處理類方法的能力,也是要藉助isa找到它所屬的類,既元類,去調用類方法,類對象本身也是專註於資料的儲存和布局形式.可參考類和元類
但與常規的類執行個體不同,一般而言類對象的欄位是固定的.即它預設情況下總是包含isa,super_class,name,version,info,instance_size,ivars,methodLists,cache,protocols.
一個類的資料形式會是如下
而它的資料在記憶體中的組織形式也是線性
我們知道,在Objective-C中,我們一般的定義形式是聲明一個類的執行個體變數,屬性,執行個體方法和類方法.並不能聲明類變數.所以一般而言類對象的資料形式就是如的那些固定的欄位.
除了我們介紹的isa,剩餘的欄位的含義如下:
super_class 指向父類的指標.因為Objective-C借鑒了SimTALK,在類的繼承實現上,是通過一條繼承鏈實現的.super_class就是整個繼承鏈的核心欄位.
name 類的名字
version 版本
info 資訊
instance_size 執行個體的記憶體大小
ivars 是一個指向執行個體變數列表的指標
methodLists 是一個指向執行個體方法列表的指標
cache 緩衝了常用的執行個體方法
protocols 是一個指向協議列表的指標
我們可以這樣簡單地去解釋運行時的Objective-C的資料結構的含義
對象與執行個體變數有關,對象自身儲存著執行個體變數
類對象與執行個體方法有關,執行個體方法必須通過類對象才能知曉
元類與類方法有關, 類方法必須通過元類才能知曉
對象,類與元類可謂與道教裡的三清一般哦~~
運行時的類和對象
運行時的類和對象如
一般而言
isa關於對象是什麼類
super_class關於繼承鏈
所有元類都有同樣的元類,因為他們的isa都指向同一個根元類
參考
Objective-C底層資料結構
類和元類
推薦拓展閱讀
Objective-C葵花寶典第一重(內功篇)--類與對象