1 下面写代码测试探索NSObject的本质
- Objective-C代码,底层实现其实都是CC++代码
#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获得)