轉(zhuǎn)自:http://husbandman.diandian.com/post/2012-08-17/40036035008
Objective-C葵花寶典第一重(內(nèi)功篇)–類與對象
切記:欲練神功逢捺,揮刀自宮寿烟;煉丹服藥嚎京,內(nèi)外齊通倦挂。
今練氣之道胚膊,不外存想導引普碎,渺渺太虛看锉,天地分清濁而生人惰瓜,人之練氣诸迟,不外練虛靈而滌蕩昏濁茸炒,氣者命之主愕乎,形者體之用。天地可逆轉(zhuǎn)壁公,人亦有男女互化之道感论,此中之道,切切不可輕傳紊册。修煉此功比肄,當先養(yǎng)心,令心不起雜念囊陡,超然于物外方可芳绩,若心存雜念,不但無功撞反,反而有性命之憂妥色。
概述
對象
Objective-C中,類和對象的底層數(shù)據(jù)結(jié)構(gòu),可以參考Objective-C底層數(shù)據(jù)結(jié)構(gòu).
其中對象是通過struct objc_object結(jié)構(gòu)實現(xiàn)
typedef struct objc_object *id;
對象在運行時候,會產(chǎn)生如下圖的結(jié)構(gòu)形式
我們把這個轉(zhuǎn)換成種更容易理解的數(shù)據(jù)組織形式
真正的內(nèi)存形式是這樣的
從對象內(nèi)存形式上來看.對象內(nèi)的變量成員,是從祖類繼承而來(子成父業(yè)啊),在對象內(nèi)部生成副本.從對象的內(nèi)存組織來看,對象本身并不關(guān)心行為(對象的方法或?qū)嵗椒?,重點都在數(shù)據(jù)的組織上.
(_)? _____? ____ _
/ /? / ___/? / __ `/
/ /? (__? )? / /_/ /
/_/? /____/? \__,_/
對象的都有一個isa實例變量,它是從繼承層次最高的NSObject繼承而來.isa是表示對象的關(guān)鍵.在Objective-C中,是不是第一等對象,isa就是其標志,就好像<變形金剛>中的汽車人都有一個
如果你發(fā)現(xiàn)的鐵家伙是這個標志
那你就趕緊逃命去吧~
isa是一個指針,指向了該對象的類.實質(zhì)上,同一個類的實例,都指向同一個類對象(類也是一種特殊對象).類中包含了實例方法,也就是說,同一個類的所有實例共用了這些實例方法.消息就是發(fā)送給對象,對象轉(zhuǎn)交給其isa指向類去處理.這種現(xiàn)象類似于當下火熱的云計算.
云雞一算,要風得風,要雨得雨
Objective-C的這種設計,既可以友好地實現(xiàn)面向?qū)ο?又可以有效地節(jié)約內(nèi)存.降低冗余數(shù)據(jù).對象對方法的調(diào)用是通過isa間接去調(diào)用,這樣就造成了方法調(diào)用的動態(tài)性,主要原因是:
一個對象并不曉得它能否應答一個方法,它本身既不包含方法的實現(xiàn),也不包含有方法的指針,而是間接通過isa轉(zhuǎn)到自己的類才能知道
類中的實例方法是以鏈表形式存在,運行時候,可以修改鏈表中的實例方法,即可以增刪改查,這與C中的函數(shù)默認都是extern的不同
從上面的分析,isa的意義就更加重大,倘若沒有isa,一個對象就跟char,int類型等沒啥區(qū)別了,不具備回應消息的本領.所以說,isa是什么,就好比是古時候官員的烏紗帽,有烏紗帽,就有權(quán)力,烏紗帽沒了,就是凡夫俗子
類
類是通過struct objc_class結(jié)構(gòu)實現(xiàn)的,
typedef struct objc_class *Class;
在運行時,將會產(chǎn)生如下圖這樣的結(jié)構(gòu)
在Objective-C的世界里,一看到isa的第一個反應就是,咦,對象.是的,Objective-C中的類其實也是一種對象.
天地不仁,以萬物為芻狗<道德經(jīng)>
既然天地生的萬物,那么天地又是何物?
如果人類是上古神仙女媧所造,那女媧又因何而生呢?
一般程序語言,對象的盡頭都是自己生了自己.自己下個蛋,爬出來了自己.似乎是悖逆的,但確實如此.作為根類的NSObject就是這樣一個家伙!
這看起來確實很困惑,但是譬如生物學中的造血干細胞可謂細胞的制造廠,但是造血干細胞又是誰制造的呢,咦,也是造血干細胞
首先,類對象也是一種對象,那么它也會有自己的行為,這種行為稱作類方法.與一般的類實例一樣,類對象也不具備處理類方法的能力,也是要借助isa找到它所屬的類,既元類,去調(diào)用類方法,類對象本身也是專注于數(shù)據(jù)的存儲和布局形式.可參考類和元類
但與常規(guī)的類實例不同,一般而言類對象的字段是固定的.即它默認情況下總是包含isa,super_class,name,version,info,instance_size,ivars,methodLists,cache,protocols.
一個類的數(shù)據(jù)形式會是如下
而它的數(shù)據(jù)在內(nèi)存中的組織形式也是線性的
我們知道,在Objective-C中,我們一般的定義形式是聲明一個類的實例變量,屬性,實例方法和類方法.并不能聲明類變量.所以一般而言類對象的數(shù)據(jù)形式就是如上圖的那些固定的字段.
除了我們介紹的isa,剩余的字段的含義如下:
super_class 指向父類的指針.因為Objective-C借鑒了SimTALK,在類的繼承實現(xiàn)上,是通過一條繼承鏈實現(xiàn)的.super_class就是整個繼承鏈的核心字段.
name 類的名字
version 版本
info 信息
instance_size 實例的內(nèi)存大小
ivars 是一個指向?qū)嵗兞苛斜淼闹羔?/p>
methodLists 是一個指向?qū)嵗椒斜淼闹羔?/p>
cache 緩存了常用的實例方法
protocols 是一個指向協(xié)議列表的指針
我們可以這樣簡單地去解釋運行時的Objective-C的數(shù)據(jù)結(jié)構(gòu)的含義
對象與實例變量有關(guān),對象自身存儲著實例變量
類對象與實例方法有關(guān),實例方法必須通過類對象才能知曉
元類與類方法有關(guān), 類方法必須通過元類才能知曉
對象,類與元類可謂與道教里的三清一般哦~~
運行時的類和對象
運行時的類和對象如下圖
一般而言
isa關(guān)于對象是什么類
super_class關(guān)于繼承鏈
所有元類都有同樣的元類,因為他們的isa都指向同一個根元類
參考