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獲得)