码迷,mamicode.com
首页 > 其他好文 > 详细

探索一个NSObject对象占用多少内存?

时间:2018-07-17 19:29:15      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:malloc   指针   ati   main   int   auto   -o   turn   runtime   

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获得

探索一个NSObject对象占用多少内存?

标签:malloc   指针   ati   main   int   auto   -o   turn   runtime   

原文地址:https://www.cnblogs.com/ZhangShengjie/p/9325064.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!