探索一個NSObject對象占用多少內存?


1 下面寫代碼測試探索NSObject的本質  

  • Objective-C代碼,底層實現其實都是C\C++代碼
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSObject *obj = [[NSObject alloc]init];
    }
    return 0;
}

把Objective-C代碼 轉換成C++代碼

在命令行中進去main.m所在的文件地址 然后輸入  xcrun  -sdk  iphoneos  clang  -arch  arm64  -rewrite-objc main.m -o mian.cpp 把main.m轉換成main.cpp

然后發現 

 

 

下面繼續探索NsObject 對象本質

#import <objc/runtime.h>
#import <Foundation/Foundation.h>
#import <malloc/malloc.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSObject *obj = [[NSObject alloc]init];
     //獲得NSObject 類的實例對象的大小
  NSLog(@"%zd",class_getInstanceSize([NSObject class])  );
        //獲取obj對象指針獲取的大小
        NSLog(@"%zd",malloc_size((__bridge const void *)obj));
    }
    return 0;
}

輸出結果分別是8 和 16 

為什么指針的大小是16呢 明明對象的實例大小只有8個字節  常理說 NSObject 是個機構體  里面的isa占8個字節 那么 NSObject也應該是8個字節

下面繼續尋找原因 進入蘋果源碼網站  https://opensource.apple.com/tarballs/ 找到objc 然后下載最新的代碼 然后打開觀察

通過上面的觀察發現 類的實例對象的大小 其實就是成員變量所占用的大小

然后繼續尋找NSObject 對象占用的空間大小 

alloc 內部 其實是調用了  allocWithzone

最后不難不難發現 如果大小不足16字節也分配了16字節的存儲空間

總結:系統分配了16個字節給NSObject對象(通過malloc_size獲得)

NSObject對象內部只使用了8個字節的空間(64bit環境下通過class_getInstanceSize獲得


免責聲明!

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



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