1. 程式人生 > >一個OC物件佔用多少記憶體?

一個OC物件佔用多少記憶體?

檢視一個NSObject物件佔用多少記憶體

1、引入標頭檔案:

#import <objc/runtime.h>

#import <malloc/malloc.h>

2、程式碼如下:

        NSObject* obj = [[NSObject alloc]init];
        
        // 獲取例項物件至少需要分配的記憶體大小,實際真正佔用的大小,8 位元組
        size_t insSize = class_getInstanceSize([NSObject class]);
        NSLog(@"NSObject Size:%zd
",insSize); // 同上 insSize = class_getInstanceSize([obj class]); NSLog(@"NSObject Size:%zd",insSize); // 獲取實際分配記憶體大小,最終分配的大小,16 位元組 size_t mSize = malloc_size((__bridge const void *)obj); NSLog(@"malloc Size:%zd",mSize); // 通過OC的原始碼可以看出配置物件記憶體至少有 16位元組

  1>、通過 class_getInstanceSize 可以獲取類物件實際佔用的大小

2>、通過 malloc_size 實際分配記憶體大小,最終分配的大小

可以通過記憶體檢視工具來驗證上面的說法:

進入Debug模式,通過 Debug -> Debug Workfllow -> View Memory (Shift + Command + M)  可以開啟記憶體檢視工具

1、進入除錯模式,斷點程式碼後,通過 po 物件,可以檢視物件對應的地址

(lldb) po obj
<NSObject: 0x1002013d0>

2、在下面Address輸入框輸入要檢視的記憶體地址,回車就可檢視

通過上面的截圖可以看到被選中的那個8個位元組都是00,都是空的,說明根本就沒有用到,實際只用到了前面的8位元組

為什麼就可以這麼肯定它佔用了16個位元組呢?因為可以看出00後面就是 03 00 00 00  了,系統記憶體分配都是連續一段的,中間是不會有間隙的,所以可以確定系統就是分配了 16個位元組

3、也可以通過 x 命令來檢視,命令如下:

(lldb) x 0x1002013d0

0x1002013d0: f1 f0 68 7c ff ff 1d 00 00 00 00 00 00 00 00 00  ..h|............

0x1002013e0: 03 00 00 00 00 01 00 00 00 36 80 02 01 00 00 00  .........6......

 一樣可以看得出後8位都是00

 檢視自定義物件的記憶體佔用大小

@interface XGPerson : NSObject

@property (nonatomic,assign) int age;
@property (nonatomic,assign) int height;
@property (nonatomic,assign) int row;

@end

@implementation XGPerson

@end

像上面這個物件,裡面有3個屬性,都是int ,每個int型別是佔4位元組的,具體其它型別佔多少可以去查官方文件

同過如下程式碼進行測試:

        XGPerson* obj = [[XGPerson alloc]init];
        obj.age = 4;
        obj.height = 5;
        obj.row = 6;
        
        // 輸出:24位元組
        size_t insSize = class_getInstanceSize([XGPerson class]);
        NSLog(@"XGPerson Size:%zd",insSize);
        
        // 輸出:32位元組
        size_t mSize = malloc_size((__bridge const void *)obj);
        NSLog(@"malloc Size:%zd",mSize);

再通過上面說的那種記憶體檢視方法去看看記憶體

(lldb) po obj
<XGPerson: 0x100602ed0>

(lldb) x 0x100602ed0
0x100602ed0: d9 12 00 00 01 80 1d 00 04 00 00 00 05 00 00 00  ................
0x100602ee0: 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

通過記憶體列印,可以看得出3個屬性分別各自佔用了4個位元組,總共是24個,那為什麼 malloc_size 會輸出32個呢?原因就是系統底層的記憶體對齊導致的。

通過上面這個輸出日誌可以看得出,如果我們這個XGPerson只有2個屬性,那它的分配大小和實際佔用大小應該都是16,因為NSObject物件預設只用到了前8個位元組

所以只有當有3個屬性的時候才會變成32個位元組。