内存区域
C++ 内存管理
new & delete
-
malloc/free只是动态分配内存空间/释放空间。
new/delete 还会调用构造函数和析构函数进行初始化与清理
-
malloc/free需要手动计算类型大小
new/delete可自动计算类型的大小
-
malloc/free管理内存失败会返回0,
new/delete等的方式管理内存失败会抛出异常。
智能指针
保留 -> 和 * 运算符
- auto_pt & unique_ptr
- 基于排他所有权模式:两个指针不能指向同一个资源
- 无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值
- shared_ptr
OC 内存管理
MRC
- “alloc”, “new”, “copy”, or “mutableCopy” 开头的方法创建的对象,引用计数 = 1
- 对一个对象发送 retain 消息,可以让对象的引用计数 +1
- 对一个对象发送 release 消息,可以让对象的引用计数 -1
- 当对象的引用计数为 0 时,即将销毁的时候,系统会向对象发送一条dealloc消息 【不能直接调用 dealloc】
自动释放池
在创建新对象时,并且系统未启动ARC特性,那么在使用完该对象后需要释放对象空间。
此时有两种选择,一种是给对象发送release消息,此时该对象空间就会马上被释放掉;
另一种是给对象发送autorelease消息,此时系统不会马上释放该对象,而是在离它最近的自动释放池结束的位置会被释放掉,因为自动释放池在执行到末尾时,会给池中对象发送release消息,若引用计数减为0,会发送dealloc消息,并将它们的内存释放掉。
ARC
- retain/release都不用考虑
- 只需要初始化的时候 [[NSObject alloc] init]
- 可以自定义 dealloc
- 只要有一个强指针在内存指向对象,对象就不能释放
- ARC 销毁时机是强引用的个数 = 0,而不是引用计数 = 0
- 默认所有对象变量的指针都是强指针
属性修饰
修饰符 |
持有方式 |
用于 |
strong |
强 |
对象 |
weak |
弱 |
对象 |
assign(默认) |
setter赋值 |
基本类型/对象 |
OC 属性小结
OC 深拷贝和浅拷贝
- copy 创建不可变对象
- mutaleCopy 创建可变对象
- 可变对象是不可变对象的子类,因此不可变对象指针可以指向可变对象
- 对于容器对象,深拷贝只拷贝最外一层,内部元素仍是浅拷贝
内存问题引起 crash
野指针、OOM