【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 實際分配內存大小,最終分配的大小

 

如下是OC的源碼,可以看得出如果分配的內存小於16的話會直接設置為16

 

 

可以通過內存查看工具來驗證上面的說法:

進入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個呢?

原因就是系統底層的內存對齊導致的 (內存對齊好像分配的16的倍數,像24不是16的倍數,所以被分配32,不知道我理解的對不對,請各位大神指點!)

通過上面這個輸出日志可以看得出,如果我們這個XGPerson只有2個屬性,那它的分配大小和實際占用大小應該都是16,因為NSObject對象默認只用到了前8個字節

所以只有當有3個屬性的時候才會變成32個字節。

-----------------------------

本文參考借鑒MJ的教程視頻,非常感謝.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM