Objective-C的本質(zhì)
我們平時(shí)編寫(xiě)的Objective-C代碼胃惜,底層實(shí)現(xiàn)其實(shí)都是C\C++代碼
Objective-C -> C\C++ -> 匯編語(yǔ)言 -> 機(jī)器語(yǔ)言
所以O(shè)bjective-C的面向?qū)ο蠖际腔贑\C++的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的
- 思考:Objective-C的對(duì)象虐呻、類(lèi)主要是基于C\C++的什么數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的绊困?
- 結(jié)構(gòu)體
將Objective-C代碼轉(zhuǎn)換為C\C++代碼
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 輸出的CPP文件
- 思考:一個(gè)OC對(duì)象在內(nèi)存中是如何布局的
- NSObject的底層實(shí)現(xiàn)
// NSObject Implementation
struct NSObject_IMPL {
Class isa; // 8個(gè)字節(jié)去团,32bit4個(gè)字節(jié)(常識(shí):在64位下抡诞,指針占8個(gè)字節(jié))
};
typedef struct objc_class *Class;// 結(jié)構(gòu)體里面Class的內(nèi)部實(shí)現(xiàn)
NSObject *obj = [[NSObject alloc] init];
本質(zhì)如下圖所示
image.png
一個(gè)NSObject對(duì)象占用多少內(nèi)存
- 系統(tǒng)分配了16個(gè)字節(jié)給NSObject對(duì)象(通過(guò)malloc_size函數(shù)獲得)
- 但NSObject對(duì)象內(nèi)部只使用了8個(gè)字節(jié)的空間(64bit環(huán)境下,可以通過(guò)class_getInstanceSize函數(shù)獲得)
可以根據(jù)objc/runtime.h里面的方法去獲取
NSObject *obj = [[NSObject alloc] init];
// 獲取NSObject類(lèi)的實(shí)例對(duì)象的成員變量所占用的大小 >>8
NSLog(@"%zd",class_getInstanceSize([NSObject class]));
另外可以根據(jù)malloc/malloc.h里面的方法去獲取
NSObject *obj = [[NSObject alloc] init];
// 獲取obj指針?biāo)赶騼?nèi)存的大小 >> 16
NSLog(@"%zd",malloc_size((__bridge const void *)obj));
2個(gè)容易混淆的函數(shù)
創(chuàng)建一個(gè)實(shí)例對(duì)象土陪,至少需要多少內(nèi)存昼汗?
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);
創(chuàng)建一個(gè)實(shí)例對(duì)象,實(shí)際上分配了多少內(nèi)存鬼雀?
#import <malloc/malloc.h>
malloc_size((__bridge const void *)obj);
內(nèi)存對(duì)齊:結(jié)構(gòu)體的大小必須是最大成員大小的倍數(shù)
另外顷窒,蘋(píng)果本身也會(huì)進(jìn)行內(nèi)存對(duì)齊的處理,分配的內(nèi)存一定是16的倍數(shù)取刃,最大為256
最后蹋肮,本人仍會(huì)深入學(xué)習(xí),更新更多文章