OC對象的本質

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

最后,本人仍會深入學習,更新更多文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。