Objective-C葵花寶典第一重(內(nèi)功篇)--類與對象

轉(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都指向同一個根元類

參考

Objective-C底層數(shù)據(jù)結(jié)構(gòu)

類和元類

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遏片,一起剝皮案震驚了整個濱河市嘹害,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丁稀,老刑警劉巖吼拥,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異线衫,居然都是意外死亡凿可,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門授账,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枯跑,“玉大人,你說我怎么就攤上這事白热×仓” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵屋确,是天一觀的道長纳击。 經(jīng)常有香客問我,道長攻臀,這世上最難降的妖魔是什么焕数? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮刨啸,結(jié)果婚禮上堡赔,老公的妹妹穿的比我還像新娘。我一直安慰自己设联,他們只是感情好善已,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布灼捂。 她就那樣靜靜地躺著,像睡著了一般换团。 火紅的嫁衣襯著肌膚如雪悉稠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天啥寇,我揣著相機與錄音偎球,去河邊找鬼。 笑死辑甜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的袍冷。 我是一名探鬼主播磷醋,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胡诗!你這毒婦竟也來了邓线?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤煌恢,失蹤者是張志新(化名)和其女友劉穎骇陈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑰抵,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡你雌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了二汛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婿崭。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肴颊,靈堂內(nèi)的尸體忽然破棺而出氓栈,到底是詐尸還是另有隱情,我是刑警寧澤婿着,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布授瘦,位于F島的核電站,受9級特大地震影響竟宋,放射性物質(zhì)發(fā)生泄漏提完。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一袜硫、第九天 我趴在偏房一處隱蔽的房頂上張望氯葬。 院中可真熱鬧,春花似錦婉陷、人聲如沸帚称。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯睹。三九已至戏羽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楼吃,已是汗流浹背始花。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孩锡,地道東北人酷宵。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像躬窜,于是被迫代替她去往敵國和親浇垦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容