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

  • 相关阅读:
    文本信息检索基本知识【转】
    单纯形【转】
    云飘忽不定?且看多种多样的云存储应用【转】
    海量数据来临 分层存储才是解决之道【转】
    伽玛函数_gamma
    设计模式理解创建模式
    Memory management demo from TCPL
    Welcome to asm!
    Monokai scheme for Qt
    Astyle for qtcreator
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/9325064.html
Copyright © 2020-2023  润新知