Objective-C的本質
我們平時編寫的Objective-C代碼,底層實現其實都是C\C++代碼
Objective-C -> C\C++ -> 匯編語言 -> 機器語言
所以Objective-C的面向對象都是基于C\C++的數據結構實現的
- 思考:Objective-C的對象、類主要是基于C\C++的什么數據結構實現的?
- 結構體
將Objective-C代碼轉換為C\C++代碼
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 輸出的CPP文件
- 思考:一個OC對象在內存中是如何布局的
- NSObject的底層實現
// NSObject Implementation
struct NSObject_IMPL {
Class isa; // 8個字節,32bit4個字節(常識:在64位下,指針占8個字節)
};
typedef struct objc_class *Class;// 結構體里面Class的內部實現
NSObject *obj = [[NSObject alloc] init];
本質如下圖所示
image.png
一個NSObject對象占用多少內存
- 系統分配了16個字節給NSObject對象(通過malloc_size函數獲得)
- 但NSObject對象內部只使用了8個字節的空間(64bit環境下,可以通過class_getInstanceSize函數獲得)
可以根據objc/runtime.h里面的方法去獲取
NSObject *obj = [[NSObject alloc] init];
// 獲取NSObject類的實例對象的成員變量所占用的大小 >>8
NSLog(@"%zd",class_getInstanceSize([NSObject class]));
另外可以根據malloc/malloc.h里面的方法去獲取
NSObject *obj = [[NSObject alloc] init];
// 獲取obj指針所指向內存的大小 >> 16
NSLog(@"%zd",malloc_size((__bridge const void *)obj));
2個容易混淆的函數
創建一個實例對象,至少需要多少內存?
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);
創建一個實例對象,實際上分配了多少內存?
#import <malloc/malloc.h>
malloc_size((__bridge const void *)obj);
內存對齊:結構體的大小必須是最大成員大小的倍數
另外,蘋果本身也會進行內存對齊的處理,分配的內存一定是16的倍數,最大為256
最后,本人仍會深入學習,更新更多文章