一、引入頭文件:工具
#import <objc/runtime.h>測試
#import <malloc/malloc.h>atom
二、代碼以下:spa
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 能夠獲取類對象實際佔用的大小3d
2>、經過 malloc_size 實際分配內存大小,最終分配的大小調試
以下是OC的源碼,能夠看得出若是分配的內存小於16的話會直接設置爲16日誌
能夠經過內存查看工具來驗證上面的說法:code
進入Debug模式,經過 Debug -> Debug Workfllow -> View Memory (Shift + Command + M) 能夠打開內存查看工具視頻
一、進入調試模式,斷點代碼後,經過 po 對象,能夠查看對象對應的地址對象
(lldb) po obj <NSObject: 0x1002013d0>
二、在下面Address輸入框輸入要查看的內存地址,回車就可查看
經過上面的截圖能夠看到被選中的那個8個字節都是00,都是空的,說明根本就沒有用到,實際只用到了前面的8字節
爲何就能夠這麼確定它佔用了16個字節呢?由於能夠看出00後面就是 03 00 00 00 了,系統內存分配都是連續一段的,中間是不會有間隙的,因此能夠肯定系統就是分配了 16個字節
三、也能夠經過 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的教程視頻,很是感謝.