我們平時編寫的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)存?

我們可以看到?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)境下)