美文网首页
面试中: 一个NSObject对象占用多少内存?

面试中: 一个NSObject对象占用多少内存?

作者: 灬朴一生 | 来源:发表于2019-08-23 17:44 被阅读0次
答案是:16个字节

Object-C的本质

Object-C -> C\C++ -> 汇编语言 -> 机器语言

所以Objective-C的面向对象都是基于C\C++的数据结构实现的

思考:Objective-C的对象、类主要是基于C\C++的什么数据结构实现的?

结构体

OC验证

  • 代码
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
    }
    return 0;
}

  • 将Objective-C代码转换为C\C++代码
    不同平台支持的代码不一样
平台
Windows
Mac
iOS
iOS平台下架构
模拟器i386
32bit armv7
64bit arm64

\color{red}{构建一个iOS平台64位架构C++代码}

参数 说明
xcrun 使用 xcode 工具
-sdk 支持平台
clang 编译器
-arch 架构
-rewrite-objc 重写OC文件
-o 输出路径,CPP(c++)

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o main-arm64.cpp

  • main-arm64.cpp中
// NSObject 在内存中,就是此结构体
struct NSObject_IMPL {
    Class isa;
};
  • 结构体中的Class
// 就是指向这个结构体的指针
typedef struct objc_class *Class;
  • 既然是指针

32位架构中,指针是占用4个字节
64位架构中,指针是占用8个字节

// 由此,我们分析
// NSObject*obj=[[NSObject alloc]init]的代码本质
[[NSObject alloc] init];
等于
struct NSObject_IMPL {
  Class isa;
};

---------------------------------------------

NSObject *obj 存储开辟的这个NSObject对象的内存地址
obj 就是 isa的地址

如上所知NSObject对象是8个字节,我们在用代码验证一下

NSObject *obj = [[NSObject alloc] init];
        
// 获得NSObject实例对象的成员变量所占用的大小 
// 打印结果 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));

// 获得obj指针所分配内存的大小
// 打印结果 16
NSLog(@"%zd", malloc_size((__bridge const void *)obj));

我们的问题是占用,所以是分配了多少内存,所以是16
当我们创建NSObject对象,会分配给我们16个字节,但我们实际利用中,只用到了8个字节


Object-C 源码地址

objc4源码可以找到class_getInstanceSize实现

相关文章

  • Objective-C对象的本质

    面试题 一个 NSObject 对象占用多少内存? 系统分配了16个字节给NSObject对象(通过malloc_...

  • iOS-Class

    面试题 一个NSObject对象占用多少内存? 系统分配了16个字节给NSObject对象(通过malloc_si...

  • 底层1:OC对象本质

    面试题:一个NSObject对象占用多少内存? 系统分配了16个字节给NSObject对象(通过malloc_si...

  • OC对象的本质

    1.一个NSObject对象占用多少内存 NSObject *obj = [[NSObject alloc] in...

  • iOS底层原理 - OC对象的本质(一)

    面试题引发的思考: Q: 一个NSObject对象占用多少内存? 系统分配了16个字节给NSObject对象(通过...

  • Objective-C对象的内存分配

    一个NSObject对象占用多少内存? 本章主要研究一个OC对象在内存中是如何布局和占用多少内存的。后面主要通过把...

  • 底层原理:OC对象的本质

    面试题 一个NSObject对象占用多少内存? 准备工作 我们新建一个demo来探究:一个NSObject对象占多...

  • iOS底层原理-OC对象的本质

    从一道面试题开始 Q:一个OC对象占用多少内存?该问题即是问NSObject *obj = [[NSObject ...

  • OC对象的本质

    第一面试题:一个NSObject对象占用多少内存?答案:系统分配了16个字节给NSObject对象但是NSObje...

  • iOS底层原理-面试题整理

    常问面试题原理分析 一个NSObject对象占用多少内存? 系统分配了16个字节给NSObject对象(通过 ma...

网友评论

      本文标题:面试中: 一个NSObject对象占用多少内存?

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