美文网首页
OC 对象的本质

OC 对象的本质

作者: 我是卖报的小行家 | 来源:发表于2021-01-06 08:26 被阅读0次

    闲来无事,学习底层
    作为一名iOS开发者,我们整体所写的OC对象,它的本质到底是什么???
    先从一道问题开始说起:
    一个NSObject对象占用多少内存
    OC对象底层实现其实就是C/C++代码
    OC ------>C/C++------>汇编语言------>机器语言(二进制语言010101)
    OC对象(NSObject)本质其实就是结构体
    验证 :将OC代码转换成C/C++代码(tips:cpp 即 c plus plus C++)
    打开终端
    clang -rewrite-objc main.m -o main.cpp
    生成指定架构的C++文件
    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
    如下图所示


    两种不同格式的cpp文件

    打开 main-arm64.cpp
    可以全局搜索NSObject_IMPL得到如下内容(结构体)

    struct NSObject_IMPL {
        Class isa;
    };
    
    //说明一个NSObject对象其本质就是结构体struct NSObject_IMPL
    isa 64位里面指针占据8个字节,32位里面占据4个字节
    

    最后看下内存图


    内存图

    最后上所有代码以及源码

    #import <Foundation/Foundation.h>
    #import <objc/runtime.h>
    #import <malloc/malloc.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            NSLog(@"Hello, World!");
            
            NSObject * object = [[NSObject alloc]init];
            
            NSLog(@"%zd",class_getInstanceSize([NSObject class]));//获取类的实例对象的成员变量所占用的存储空间的大小结果是8
            
            NSLog(@"%zd",malloc_size((__bridge const void *)(object)));//获取objc指针指向内存的大小结果为16
        }
        return 0;
    }
    

    源码

    size_t instanceSize(size_t extraBytes) {
        
        size_t size = alignedInstanceSize() + extraBytes;  //NSObnect 此处为8
        
        if (size < 16) size = 16;
        return  size;
    }
    

    总计:系统分配了16个字节给NSObject对象(通过malloc函数获得),但NSObject对象内部只使用了8个字节空间(通过class_getInstanceSize函数获得 ) (64bit下)

    补充一般:String字符串:8个字节,int:4个字节 double:4个字节

    相关文章

      网友评论

          本文标题:OC 对象的本质

          本文链接:https://www.haomeiwen.com/subject/qndgoktx.html