探索一个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获得

posted @ 2018-07-17 18:20  ZhangShengjie  阅读(1405)  评论(0编辑  收藏  举报