这是我参与「第四届青训营 」笔记创作活动的的第4天
Objective-C内存管理 | 青训营笔记
基本概念
Heap & Stack
- Heap:
- 低地址向高地址
- 线程共享
- Stack:
- 高地址向低地址
- 高地址向低地址
C内存管理
- malloc/free管理堆内存
C++内存管理
- new/delete
- 智能指针
- auto_pt 和 unique_ptr
- 不能指向同一个资源
- 无法进行左值赋值
- shared_ptr
- 可以赋值
- 实现:对象+引用计数,引用计数为0时,销毁
- auto_pt 和 unique_ptr
内存管理: C vs C++
- 空间
- malloc/free 只是动态分配内存空间/释放空间
- new/delete 还会调用构造函数和析构函数进行初始化与清理
- 计算大小
- malloc/free 需要手动计算类型大小
- new/delete 可自动计算类型的大小
- 安全性
- malloc/free 管理内存失败会返回0
- new/delete 管理内存失败会拋出异常
IOS内存管理机制
核心:管理强引用计数
MRC手动
已经弃用,使用retain和release
ARC自动
在编译时自动加入retain和release
实际应用
Property修饰符
- 修饰对象
- strong/weak:拥有/不拥有对象
- delegate用weak修饰
- copy:一般修饰不可变对象
- strong/weak:拥有/不拥有对象
- 简单类型
- assign
循环引用
循环引用将导致对象无法释放,导致内存泄漏
不可变 vs 可变
- 不可变:
- 对象数据不会被修改
- 线程安全
- 查找性能好
- 用于声明/方法参数/返回值
- 可变
- 对象数据可以被修改
- 线程不安全
- 查找性能差
- 用于方法内的临时变量
浅拷贝 vs 深拷贝
- NSString
- 浅拷贝copy
- 深拷贝mutableCopy
- 作为属性时,用copy和strong修饰,都是浅拷贝
- NSMutableString:两个方法都是深拷贝
- 作为属性时,用copy修饰是深拷贝,用strong修饰是浅拷贝(地址相同)
内存引起的Crash
- 访问野指针
- OOM内存占用过高