zoukankan      html  css  js  c++  java
  • 探索一个NSObject对象占用多少内存?

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

  • 相关阅读:
    怎样从外网访问内网Django?
    怎样从外网访问内网Jboss?
    怎样从外网访问内网php-fpm?
    python中关于发邮件的示例
    python中关于局部变量与全局变量的认识
    python实现二分查找与冒泡排序
    自动化测试框架中关于selenium api的二次封装
    python 的日志相关应用
    python中关于字符串的操作
    EBS 物料单位换算
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/9325064.html
Copyright © 2011-2022 走看看