Object-C的本質(zhì)

我們平時編寫的Objective-C代碼,底層實現(xiàn)其實都是C\C++代碼

編譯順序

所以O(shè)bjective-C的面向?qū)ο蠖际腔贑\C++的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的;那么 Objective-C的對象、類主要是基于C\C++的什么數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的?

答案是結(jié)構(gòu)體,因為只有結(jié)構(gòu)體能存儲不同類型的對象。下面我們一步一步驗證一下,NSObject 對象的本質(zhì)是不是就是結(jié)構(gòu)體,需要先將oc代碼轉(zhuǎn)成c/c++代碼

轉(zhuǎn)換之前我們需要指定一個具體系統(tǒng)以及架構(gòu),就以iphone的64位架構(gòu)來區(qū)分,補充一點是模擬器的架構(gòu)是i386、32bit是arm7、64bit是arm64,所以我們需要執(zhí)行的代碼是

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

然后生成一個main-arm64.cpp對應(yīng)的c/c++代碼,在?main-arm64.cpp 內(nèi)我們可以找到NSObject_IMPL這個結(jié)構(gòu)體,它就是NSObject的具體實現(xiàn);因為結(jié)構(gòu)體內(nèi)只有一個isa成員,所以isa的地址就是當(dāng)前結(jié)構(gòu)體在內(nèi)存中的地址,所以obj指針中存儲的地址就是isa的地址值。

接下來,延伸一到面試題

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

打印結(jié)果

我們可以看到?malloc_size 返回的的確是16個字節(jié),那么為什么class_getInstanceSize 返回的是8呢?通過查看源碼注釋我們知道,其實class_getInstanceSize返回的是對象成員變量所占用的大小,但是系統(tǒng)分配的內(nèi)存的時候,如果你的內(nèi)存大小小于16,那么會按照16個字節(jié)來分配。

答:系統(tǒng)分配了16個字節(jié)給NSObject對象,但是NSObject對象內(nèi)部只使用了8個字節(jié)的空間(64bit環(huán)境下)

最后編輯于
?著作權(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ù)。

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