Object- C 内存管理 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的第2天
C/C++的内存管理
- C 用malloc/free动态分配内存
- C++ 用new/delete分配内存
| malloc/free(C) | new/delete(C++) |
|---|
| 只是动态分配内存空间/释放空间 | 还会调用构造函数和析构函数 |
| 需要手动计算类型大小 | 可自动计算类型的大小 |
| 管理内存失败会返回0 | 管理内存失败会抛出异常 |
- C++内存管理
- 智能指针smart pointer
- 保留->和*运算符
| auto_pr & uique_ptr | shared_ptr |
|---|
| 两个指针不能指向同一个地址 | 可以复制赋值操作 |
| 不能进行左值赋值构造 | 对象+引用计数器 |
- 引用计数器(Reference Counting)
- 记录了当前资源到底有多少指针在引用(可以访问这个资源)
- 当新增加一个可以访问这个资源的引用,计数器会加1,反之会减去1
- 当引用计数=0时,对象会被销毁
iOS内存管理
- iOS内存管理的核心是管理(强)引用计数
- 任何继承NSObject的对象都需要进行内存管理
- 继承NSObject的对象会分配到堆里
MRC (Manual Reference Counting)
- retain -> 引用计数+1
- release -> 引用计数-1
- 当对象的引用计数=0即将销毁,系统会向对象发送dealloc
- “alloc”,“new”,“copy”,“mutableCopy”创建的对象,引用计数=1
ARC (Automatic Reference Counting)
- retain/release 都不用手动写
- 只要有一个强指针在内存指向对象,对象就不能释放
- ARC销毁时机是强引用的个数=0
- 而不是引用计数=0
- 默认所有对象变量的指针都是强指针
自动释放池(Autorelease-pool)
- 对象会放到自动释放池,统一释放
- autorelease和release的区别:
- release是马上释放对某个对象的强引用
- autorelease是延迟释放某个对象
- 部分场景下,使用autorelease pool可以降低内存峰值
Property
- strong
- weak
- 不拥有属性对象
- 弱持有
- 只有OC对象才能使用该属性
- copy
- assign
- 指定setter使用简单赋值
- 一般用于基本类型/NSInteger/CGRect
- default修饰符
深浅拷贝
- 浅拷贝
- 指针拷贝
- 复制一个新的指针,指向同一块内存区域,实际上内存并没有发生拷贝
- 深拷贝
- 内容拷贝
- 拷贝数据到一块新内存区域,指针指向拷贝到数据区
| copy | mutablecopy |
|---|
| 不可变对象 | 浅拷贝 | 深拷贝 |
| 可变对象 | 深拷贝 | 深拷贝 |