NSObject本質(zhì)(一)一個NSObject對象在內(nèi)存中占用多少個字節(jié)笨奠?

作為一名軟件開發(fā)工程師袭蝗,我們都了解,程序最終要運行在終端般婆,需要經(jīng)過預處理到腥、編譯、裝載蔚袍、鏈接幾個過程乡范。正因如此,想了解NSObject的本質(zhì)問題啤咽,我們就需要知道在編譯階段都做了些什么事情晋辆。

Object-C語言屬于C語言分支,很自然我們會想到闰蚕,它的編譯過程會不會是先轉(zhuǎn)換成C/C++,然后再轉(zhuǎn)換為匯編語言连舍,繼而形成最終的機器碼010101没陡,經(jīng)過鏈接后,開始真正的運行起來索赏。如圖所示:

那么怎么來進行驗證呢盼玄?首先我們新建一個命令行工程,創(chuàng)建一個NSObject對象:

????NSObject *obj = [[NSObject alloc]init];

利用Clang編譯器前端潜腻,將我們所編寫的Object-C 語言轉(zhuǎn)換為C++埃儿。

打開終端,在終端輸入命令:

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.arm64.cpp

該條指令的意思是利用 Xcode 的clang編譯器融涣,將main.m文件童番,編譯為支持iOS 64位架構(gòu)的C++文件精钮,導出文件名為main.arm64.cpp。

打開生成的C++文件剃斧,搜索 NSObject_Impl轨香,我們會看到如下代碼:

看名字:NSObject_IMPL,我們可以理解為NSObject_implection幼东,及NSObject類的實現(xiàn)部分臂容,對比NSObject.h中對于NSObject的定義:

此時我們可以發(fā)現(xiàn),@interface 類經(jīng)編譯器編譯后根蟹,變成了C++中的結(jié)構(gòu)體類型脓杉,也就是說NSObject的本質(zhì)就是C++中的結(jié)構(gòu)體。



明白了NSObject是通過C++的結(jié)構(gòu)體進行實現(xiàn)的简逮,下一步的工作就是探究一個NSObject對象球散,在內(nèi)存中占用多少內(nèi)存了。

結(jié)構(gòu)體中只有一個Class類型的isa成員买决,那么Class又是什么結(jié)構(gòu)呢沛婴,繼續(xù)深究我們發(fā)現(xiàn):

ISA

ISA其實是一個指向結(jié)構(gòu)體的指針,在64位架構(gòu)中督赤,一個指針占有8個字節(jié)的內(nèi)存大小嘁灯,因為結(jié)構(gòu)體NSObject中只有一個成員isa,也就是說ISA的地址就是NSObject的地址躲舌,NSObject占用8個字節(jié)的存儲空間丑婿。為了驗證我們的猜測是否正確,可以通過runtime中提供的class_getInstanceSize來進行驗證:

結(jié)果和我們猜測的一樣没卸,輸出size = 8羹奉。

細心的朋友已經(jīng)發(fā)行在控制臺中還有一個打印結(jié)果 allocSize = 16。

那這個又該如何解釋呢约计?

我們通過runtime獲取的是實際占用的空間大小诀拭,通過malloc_size函數(shù)獲取的是系統(tǒng)分配的內(nèi)存大小,也就是說系統(tǒng)給NSObject對象分配了16個字節(jié)的空間煤蚌,但是結(jié)構(gòu)體中只有一個isa成員耕挨,在64位環(huán)境下,只占用了前面8個字節(jié)大小尉桩。

同時我們也可以利用Xcode的debug工具來進行驗證筒占。

在剛才的斷點處,我們看到NSObject的地址為0x100402f90蜘犁,打開Xcode的viewMemory調(diào)試器翰苫,步驟為Debug->DebugWorkFlow->ViewMemory,在address欄輸入剛才的地址,看到如下結(jié)果:


注意:我們在這里看到左邊的地址是十進制表示形式奏窑,右邊顯示的是16進制表示法导披,0x100402f90對應的十進制值為:

系統(tǒng)分配了一段連續(xù)的內(nèi)存空間,1個16進制數(shù)字代表4個2進制位良哲,2個16進制剛好表示1個字節(jié)盛卡。從圖中我們可以看出前8個字節(jié)已經(jīng)被占用,也就是isa變量的地址筑凫,后8個字節(jié)為0滑沧,為空。從這里也可以間接證明系統(tǒng)為NSObject對象分配了16個字節(jié)巍实,實際只用了8個字節(jié)的內(nèi)存大小滓技。



總結(jié):1.NSObject對象的本質(zhì)是結(jié)構(gòu)體

? ? ? ? ? ? 2.在64位環(huán)境下,系統(tǒng)為NSObject對象分配了16個字節(jié)棚潦,因為結(jié)構(gòu)體中只有一個指向結(jié)構(gòu)體的指針isa成員令漂,只占用了8個字節(jié)的大小。

? ? ? ? ? ? 3.通過runtime中的?class_getInstanceSize() 函數(shù)獲取到的是對象實際占用的地址

? ? ? ? ? ? ? ?通過maclloc函數(shù):malloc_size()獲取到的是系統(tǒng)為對象分配的地址丸边。

如果還有不清楚的地方叠必,歡迎探討。

參考內(nèi)容:小碼哥底層原理:NSObject對象的本質(zhì)

gcc/llvm 編譯器對比

gdb 與lldb的對比

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載妹窖,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者纬朝。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骄呼,隨后出現(xiàn)的幾起案子共苛,更是在濱河造成了極大的恐慌,老刑警劉巖蜓萄,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隅茎,死亡現(xiàn)場離奇詭異,居然都是意外死亡嫉沽,警方通過查閱死者的電腦和手機辟犀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绸硕,“玉大人堂竟,你說我怎么就攤上這事〕伎В” “怎么了跃捣?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵漱牵,是天一觀的道長夺蛇。 經(jīng)常有香客問我,道長酣胀,這世上最難降的妖魔是什么刁赦? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任娶聘,我火速辦了婚禮,結(jié)果婚禮上甚脉,老公的妹妹穿的比我還像新娘丸升。我一直安慰自己,他們只是感情好牺氨,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布狡耻。 她就那樣靜靜地躺著,像睡著了一般猴凹。 火紅的嫁衣襯著肌膚如雪夷狰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天郊霎,我揣著相機與錄音沼头,去河邊找鬼。 笑死书劝,一個胖子當著我的面吹牛进倍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播购对,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼猾昆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洞斯?” 一聲冷哼從身側(cè)響起毡庆,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烙如,沒想到半個月后么抗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡亚铁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年蝇刀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徘溢。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡吞琐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出然爆,到底是詐尸還是另有隱情站粟,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布曾雕,位于F島的核電站奴烙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜切诀,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一揩环、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幅虑,春花似錦丰滑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擎宝,卻和暖如春貌亭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背认臊。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工圃庭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人失晴。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓剧腻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涂屁。 傳聞我的和親對象是個殘疾皇子书在,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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