一却特、oc對象底層原理分析

一建峭、OC對象的分類

OC對象主要可以分為三種:
instance對象(實(shí)例對象)
class對象(類對象)
meta-class對象(元類對象)

1.instance對象就是通過類alloc出來的對象症副,每次調(diào)用alloc都會產(chǎn)生新的instance對象凌受。object1和object2都是NSObject的instace對象(實(shí)例對象)阵子,但他們是不同的兩個對象,并且分別占據(jù)著兩塊不同的內(nèi)存胜蛉。
NSObjcet *object1 = [[NSObjcet alloc] init];
NSObjcet *object2 = [[NSObjcet alloc] init];

instance對象在內(nèi)存中存儲的信息包括:1.isa指針 2.其他成員變量挠进。


image.png

那么一個NSObject對象占用多少內(nèi)存?
NSObjcet實(shí)際上是只有一個名為isa的指針的結(jié)構(gòu)體誊册,因此占用一個指針變量所占用的內(nèi)存空間大小领突,如果64bit占用8個字節(jié),如果32bit占用4個字節(jié)案怯。

2.每一個類在內(nèi)存中有且只有一個class對象君旦。可以通過打印內(nèi)存地址證明
Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = [NSObject class];
// runtime
Class objectClass4 = object_getClass(object1);
Class objectClass5 = object_getClass(object2);
NSLog(@"%p %p %p %p %p", objectClass1, objectClass2, objectClass3, objectClass4, objectClass5);

class對象在內(nèi)存中存儲的信息主要包括:
isa指針
superclass指針
類的屬性信息(@property),類的成員變量信息(ivar)
類的對象方法信息(instance method)金砍,類的協(xié)議信息(protocol)


image.png
成員變量的值時存儲在實(shí)例對象中的局蚀,因?yàn)橹挥挟?dāng)我們創(chuàng)建實(shí)例對象的時候才為成員變賦值。但是成員變量叫什么名字恕稠,是什么類型琅绅,只需要有一份就可以了。所以存儲在class對象中鹅巍。
3.元類對象 meta-class
//runtime中傳入類對象此時得到的就是元類對象
Class objectMetaClass = object_getClass([NSObject class]);
// 而調(diào)用類對象的class方法時得到還是類對象千扶,無論調(diào)用多少次都是類對象
Class cls = [[NSObject class] class];
Class objectClass3 = [NSObject class];
class_isMetaClass(objectMetaClass) // 判斷該對象是否為元類對象
NSLog(@"%p %p %p", objectMetaClass, objectClass3, cls); // 后面兩個地址相同,
說明多次調(diào)用class得到的還是類對象
每個類在內(nèi)存中有且只有一個meta-class對象骆捧。

meta-class對象和class對象的內(nèi)存結(jié)構(gòu)是一樣的县貌,但是用途不一樣,在內(nèi)存中存儲的信息主要包括:
isa指針
superclass指針
類的類方法的信息(class method)

meta-class對象和class對象的內(nèi)存結(jié)構(gòu)是一樣的凑懂,所以meta-class中也有類的屬性信息煤痕,類的對象方法信息等成員變量,但是其中的值可能是空的接谨。
image.png

二摆碉、對象的isa指針指向哪里

1.instance的isa指向class,當(dāng)調(diào)用對象方法時脓豪,通過instance的isa找到class巷帝,最后找到對象方法的實(shí)現(xiàn)進(jìn)行調(diào)用。
2.class的isa指向meta-class
當(dāng)調(diào)用類方法時扫夜,通過class的isa找到meta-class楞泼,最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用


image.png

3.當(dāng)對象調(diào)用其父類對象方法的時候,又是怎么找到父類對象方法的呢笤闯?堕阔,此時就需要使用到class類對象superclass指針。

當(dāng)Student的instance對象要調(diào)用Person的對象方法時颗味,會先通過isa找到Student的class超陆,然后通過superclass找到Person的class,最后找到對象方法的實(shí)現(xiàn)進(jìn)行調(diào)用浦马,同樣如果Person發(fā)現(xiàn)自己沒有響應(yīng)的對象方法时呀,又會通過Person的superclass指針找到NSObject的class對象,去尋找響應(yīng)的方法
image.png

4.當(dāng)類對象調(diào)用父類的類方法時晶默,就需要先通過isa指針找到meta-class谨娜,然后通過superclass去尋找響應(yīng)的方法。

當(dāng)Student的class要調(diào)用Person的類方法時磺陡,會先通過isa找到Student的meta-class趴梢,然后通過superclass找到Person的meta-class漠畜,最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用。

最后又是這張靜定的isa指向圖垢油,經(jīng)過上面的分析我們在來看這張圖盆驹,就顯得清晰明了很多。


image.png
對isa滩愁、superclass總結(jié)

1.instance的isa指向class
2.class的isa指向meta-class
3.meta-class的isa指向基類的meta-class躯喇,基類的isa指向自己
4.class的superclass指向父類的class,如果沒有父類硝枉,superclass指針為nil
5.meta-class的superclass指向父類的meta-class廉丽,基類的meta-class的superclass指向基類的class
6.instance調(diào)用對象方法的軌跡,isa找到class妻味,方法不存在正压,就通過superclass找父類
7.class調(diào)用類方法的軌跡,isa找meta-class责球,方法不存在焦履,就通過superclass找父類
本文面試題總結(jié):

一個NSObject對象占用多少內(nèi)存?

答:一個指針變量所占用的大谐狻(64bit占8個字節(jié)嘉裤,32bit占4個字節(jié))
對象的isa指針指向哪里?
答:instance對象的isa指針指向class對象栖博,class對象的isa指針指向meta-class對象屑宠,meta-class對象的isa指針指向基類的meta-class對象,基類自己的isa指針也指向自己仇让。
OC的類信息存放在哪里典奉?
答:成員變量的具體值存放在instance對象。對象方法丧叽,協(xié)議卫玖,屬性,成員變量信息存放在class對象蠢正。類方法信息存放在meta-class對象骇笔。

參考鏈接:http://www.reibang.com/p/aa7ccadeca88

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嚣崭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌懦傍,老刑警劉巖雹舀,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粗俱,居然都是意外死亡说榆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來签财,“玉大人串慰,你說我怎么就攤上這事〕簦” “怎么了邦鲫?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長神汹。 經(jīng)常有香客問我庆捺,道長,這世上最難降的妖魔是什么屁魏? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任滔以,我火速辦了婚禮,結(jié)果婚禮上氓拼,老公的妹妹穿的比我還像新娘你画。我一直安慰自己,他們只是感情好桃漾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布坏匪。 她就那樣靜靜地躺著,像睡著了一般呈队。 火紅的嫁衣襯著肌膚如雪剥槐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天宪摧,我揣著相機(jī)與錄音粒竖,去河邊找鬼。 笑死几于,一個胖子當(dāng)著我的面吹牛蕊苗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沿彭,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼朽砰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喉刘?” 一聲冷哼從身側(cè)響起瞧柔,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睦裳,沒想到半個月后造锅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廉邑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年哥蔚,在試婚紗的時候發(fā)現(xiàn)自己被綠了倒谷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡糙箍,死狀恐怖渤愁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情深夯,我是刑警寧澤抖格,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站塌西,受9級特大地震影響他挎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捡需,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一办桨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧站辉,春花似錦呢撞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汰蓉,卻和暖如春绷蹲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顾孽。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工祝钢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人若厚。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓拦英,卻偏偏與公主長得像,于是被迫代替她去往敵國和親测秸。 傳聞我的和親對象是個殘疾皇子疤估,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

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