一个NSObject对象占多少内存?

以下都是在64bit环境下操作:

我们平时编写的Objective-C代码,底层实现其实都是C\C++代码

在这里我们将main.m 使用clang转成c++文件,也就是在终端输入

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp

这样,在文件夹里就会生成main.cpp文件。

然后我们查看nsobject源码,再对比c++里面的源码,

接下来,进入正题了,导入头文件

#import <objc/runtime.h>

#import <malloc/malloc.h>

NSLog(@"%zd",class_getInstanceSize([NSObject class])); // 8

NSLog(@"%zd",malloc_size((__bridge const void *)objc)); // 16

我们发现两者打印的值有偏差,那么问题来了,为什么呢?

接下来,我们进入源码发现,oc对象的本质是一个结构体,

class_getInstanceSize,这是runtime获取实例对象的大小,并不是实际大小,系统真正分配的是16个字节,

,runtime获取的是isa的大小,一个指针也就是8个字节,

malloc_size源码,返回的就是系统分配的内存了,这就能解决为什么打印的不一样了。

接下来,我们再探讨malloc_size为什么打印出来是16,这里我们需要看他的源码https://opensource.apple.com/tarballs/,这是苹果开源的源码,搜索objc4,打开后,下载最大的包,如下图756的,解压后,直接xcode打开,接下来就全看截图吧,第7步的extraBytes为之前传的0。

我们现在创建一个person对象,含属性height,再创建一个student对象继承person,含no和age属性,分别输出

我们可以看到实例对象大小为8+4+4+4为20,根据系统内存对齐,为最大内存的倍数,为24,但是mallocsize上,为32,我们看libmalloc源码,实际传进去为实例对象的大小,也就是24,但是系统又做了一步,具体看图吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值