这是我参与「第四届青训营 -IOS场」笔记创作活动的第1篇笔记
Objective-C(OC)的内存管理
一. 背景
Stack 栈
- 具有先进先出(FIFO)的特性
- 栈指针(Stack pointer)指向栈顶,一般存在寄存器
- 由高地址指向低地址
- 一般存储局部变量/参数/函数调用后返回的地址
Heap 堆
- 手动分配分配堆空间
- 地址向高地址拓展
- 存储数组和对象,线程共享
C/C++的内存管理
- C: 用 malloc & free 动态分配内存
- C++: 新增使用 new & delete 动态分配内存
二. 介绍
-
内存管理的对象是什么?
- 继承自NSObject的对象,包括手动创建的对象和框架提供的类对象
-
为什么要进行内存管理?
- 多个对象互相强引用,会导致对象无法被释放
- 一个程序如果占用内存过大,系统会强制关闭程序,造成内存的Crash
- 如果提前释放指针(指在使用该指针之前),会导致野指针问题,造成内存Crash
三. OC中两种内存管理方式
- MRC(手动引用计数)
- 由开发者手动维护引用计数器来进行内存管理
- 给对象发送retain消息,让对象引用计数+1
- 给对象发送release消息,让对象引用计数-1
- 当引用计数为0时 对象被销毁
- ARC(自动引用计数)
- 不用考虑retain和release 由系统计算引用计数
- 指针分为强指针(strong)和弱指针(weak),默认使用强指针引用对象
- ARC销毁的时机是当对象强引用计数为0时,对象会被销毁。
四. @property 修饰符
OC中一般使用@property来在类的.h文件下声明属性,包括继承自NSObject的对象属性和基本类型的属性,在创建实例时,会创建属性、setter和getter方法。形式:
@property(参数1, 参数2, 参数3...)(类型)属性名;
@property的与内存管理有关的参数
- assign/strong/weak/copy
- 基本类型变量/NSInteger/CGRect,使用assign
- 当属性是一个继承自NSObject的类的对象时,使用strong/weak/copy
- 当需要强持有属性对象时,使用strong
- 当需要若持有属性对象时,使用weak
- 对于NSString NSArray等等不期望被外界改变的属性,使用copy