40_iOS干货27_查看OC对象占用至少多少字节的方法

查看一个NSObject占用至少多少字节的方法?

1,查看底层

进入NSObject的头文件,有一个isa指针(指针大小8个字节)

 

2,OC转C++的命令

进入文件目录:pxcrun -sdk iphoneos clang  -arch  arm64 -rewrite-objc  OC源文件  -o  输出的CPP文件

查看底层c++的实现(指针大小8个字节):

 

3,sizeOf运算符获取空间的大小:

sizeOf([NSObject class])

该运算符为编译时,就可以获取大小,类似于宏定义

下列class_getInstanceSize函数,则要在运行时获取

 

4,runtime函数获取实例空间大小:

创建一个实例对象,至少需要多少内存?(8个字节)
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);

 

5,malloc获取内存空间的大小

创建一个实例对象,实际上分配了多少内存?(16个字节)
#import <malloc/malloc.h>
malloc_size((__bridge const void *)obj);(注意使用桥接命令_ _bridge)

 

6,利用xcode工具来查看

断点后,Debug -> Debug Workfllow -> View Memory (或者快捷键Shift + Command + M)

或者,在调试窗口输入命令:memory read/数量格式字节数  内存地址

 

7,查看苹果开源的源码

进入开源网址:https://opensource.apple.com,挑选数字最大,即是最新的版本

alloc调用的底层if(size < 16) size = 16;

 

8,结论:

系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)
 

9,扩展

1,类的对象转化成结构体:(下列类的对象和结构体等价)

等价于:

2,大端和小端:

小端从高地址位开始(mac使用的小端),大端相反

 

3,结构体的内存对齐:

最大成员变量的整数倍,利于计算机访问

 

4,操作系统的内存对齐:

查看苹果源码:libMalloc库中,堆空间buckets分配的都是16的倍数

gnu组织:对齐的倍数,非i386为16,i386为8

所以,结构体传入的如果是24,即实际对象只用了24个字节的空间,操作系统也会分配32个字节给该变量

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值