iOS 对象的内存分配流程

343 阅读2分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

前言

之前给大家分享了iOS 的内存分配原则:

iOS内存分配原则1/2

iOS内存分配原则2/2

这次就在往上提一提,聊一聊iOS对象的内存分配流程

顺便填一下上一篇文章买下的坑~~~哈哈~~~

首先我们知道,iOS对象创建最终都会走到 alloc 方法。

NSObject *obj = [[NSObject alloc] init];

那么就来看看alloc的源码是如何实现的,具体如何进行源码分析有很多文章都介绍过,我就不过多介绍了.

如果你实在不知道哪里下源码、怎么进行源码分析,你再联系我,我们之前或许就差一顿饭,哈哈 ~~~

image.png

对象内存分配流程

下面是我根据源码画的流程图:

alloc源码流程图.png 看不清楚的可以看到这里看

这个图中有3个点需要注意:

  1. 属性内存大小最小是16字节
  2. 获取属性所占内存大小时会进行一个8字节对齐
  3. 在实际进行内存分配时会进行一个16字节对齐

接下来对这三点做个简要证明

属性内存大小最小是16字节

image.png

可以看到obj 属性内存大小是8字节,实际分配大小是16字节,将16字节打印出来后可以发现,前8字节是isa指针,后面8位是空的。

获取属性所占内存大小时会进行一个8字节对齐

首先创建一个类

@interface Persion : NSObject
@property (nonatomic, copy) NSString *name;//占8个字节
@property (nonatomic, assign) int age;//占4个字节
@end

其中,NSString 是字符串类型占8个字节,int类型占用4个字节,然后我们查看其内存

image.png

可以看到通过class_getInstanceSize获得的是24,而对象实际所需要的内存大小是 8 + 8 + 4 = 20,因为有8字节对齐存在,所以最终是24

在实际进行内存分配时会进行一个16字节对齐

通过上面的例子同样可以看到最终分配的大小是32,这就也验证了最终分配大小会进行一个16字节对齐的操作