NSObject對象本質(zhì)

在我們平時寫的Objective-C代碼,底層實現(xiàn)的其實都是C\C++代碼,編譯過后會轉(zhuǎn)換成C\C++代碼,最后又會轉(zhuǎn)成匯編語言,然后是機(jī)器碼
image.png
    先在main.m定義了一個繼承于NSObject的類 然后通過命令行 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m 獲得生成的C\C++代碼 打開生成后的main.cpp可以看到
image.png
image.png
image.png
image.png

IMPL的意思就是implementation實現(xiàn)的意思上圖可以看的比較清楚在OC的頭文件里面NSObject底層實現(xiàn)就是左邊里面只有一個成員變量isa,在底層實現(xiàn)里面NSObject本質(zhì)他就是一個結(jié)構(gòu)體(圖的右邊)。Class點進(jìn)去看就是一個指向結(jié)構(gòu)體的指針,在64位環(huán)境下占8個字節(jié),所以NSObject在內(nèi)存中就占8個字節(jié),但是真正的的情況是占16個字節(jié),通過運(yùn)行時runtime可以發(fā)現(xiàn),且看下面分析。

image.png
image.png
由上圖不難看出NSObject實例對象的成員變量所占用的內(nèi)存大小是8個字節(jié),實例對象obj獲得系統(tǒng)分配的內(nèi)存是16個字節(jié),所以NSObject占用的內(nèi)存大小就是系統(tǒng)分配的內(nèi)存大小16字節(jié)。runtime部分源碼是開源的,上面class_getInstanceSize可以通過源碼(源碼下載網(wǎng)站)(后綴數(shù)字越大代表源碼最新)可以看出
image.png
image.png
image.png

是通過一個instanceSize的方法返回最后的大小,而instanceSize方法里面寫的最低返回就是16個字節(jié),硬性規(guī)定了最少16個字節(jié)。如果是NSObject的話通過size_t size = alignedInstanceSize() + extraBytes;拿出來的是8個字節(jié)。方法alignedInstanceSize返回的是成員變量大小,extraBytes額外的一般來說是0字節(jié)。

從另一個角度去看,首先我們打個斷點,查看obj的內(nèi)存地址,然后選擇Debug->Debug Workflow->View Memory 在下圖框中輸入斷點查看的地址敲回車
image.png
image.png
image.png

剛才我們通過源碼了解到系統(tǒng)為obj分配了16個字節(jié),上圖綠色框框中框出了16個字節(jié),1個16進(jìn)制位代表4個2進(jìn)制位,2個16進(jìn)制位就代表8個2進(jìn)制位,也就是1個字節(jié)。前8個字節(jié)就代表isa,后面8個字節(jié)都是00,再后面就不是0,所以能推斷出這16個字節(jié)是連續(xù)的,紅色框框框的就是其它的內(nèi)存,最嚴(yán)謹(jǐn)?shù)姆椒ㄟ€是通過運(yùn)行時獲取。

    最后總結(jié)一下就是:
    1.一個NSObject對象占用多少內(nèi)存?
    系統(tǒng)分配了16個字節(jié)給NSObject對象(通過malloc_size函數(shù)獲得)
    但NSObject對象內(nèi)部只使用了8個字節(jié)的空間(64bit環(huán)境下,可以通過class_getInstanceSize函數(shù)獲得)

    創(chuàng)建一個實例對象,至少需要多少內(nèi)存?
    #import <objc/runtime.h>
    class_getInstanceSize([NSObject class]);

    創(chuàng)建一個實例對象,實際上分配了多少內(nèi)存?
    #import <malloc/malloc.h>
    malloc_size((__bridge const void *)obj);

有興趣的可以自己新建一些復(fù)雜的繼承NSObject的對象看看內(nèi)存再根據(jù)源碼自己驗證分析一下

這里附上常用LLDB指令,也可以通過一些指令讀取內(nèi)存,有疑問請聯(lián)系博主,以上圖片有來自網(wǎng)絡(luò)來自本人來自小碼哥教育,如果問題聯(lián)系博主刪除。!
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容