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
class_getInstanceSize([NSObject class]);

 

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

创建一个实例对象,实际上分配了多少内存?(16个字节)
#import
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,类的对象转化成结构体:(下列类的对象和结构体等价)

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

等价于:

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

2,大端和小端:

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

 

3,结构体的内存对齐:

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

 

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

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

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

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

 

你可能感兴趣的:(iOS)