这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
前言
之前给大家分享了iOS 的内存分配原则:
这次就在往上提一提,聊一聊iOS对象的内存分配流程
顺便填一下上一篇文章买下的坑~~~哈哈~~~
首先我们知道,iOS对象创建最终都会走到 alloc 方法。
NSObject *obj = [[NSObject alloc] init];
那么就来看看alloc的源码是如何实现的,具体如何进行源码分析有很多文章都介绍过,我就不过多介绍了.
如果你实在不知道哪里下源码、怎么进行源码分析,你再联系我,我们之前或许就差一顿饭,哈哈 ~~~
对象内存分配流程
下面是我根据源码画的流程图:
看不清楚的可以看到这里看
这个图中有3个点需要注意:
- 属性内存大小最小是16字节
- 获取属性所占内存大小时会进行一个8字节对齐
- 在实际进行内存分配时会进行一个16字节对齐
接下来对这三点做个简要证明
属性内存大小最小是16字节
可以看到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个字节,然后我们查看其内存
可以看到通过class_getInstanceSize获得的是24,而对象实际所需要的内存大小是 8 + 8 + 4 = 20,因为有8字节对齐存在,所以最终是24
在实际进行内存分配时会进行一个16字节对齐
通过上面的例子同样可以看到最终分配的大小是32,这就也验证了最终分配大小会进行一个16字节对齐的操作