一、过程:
- 生成对象 -> alloc
- 持有对象 -> retain
- 释放对象 -> release
- 废弃对象:所有引用都释放 -> dealloc
二、MRC:需要手动释放自己持有的对象
[参考资料]:http://www.open-open.com/lib/view/open1460693431491.html
- NSObject负责内存管理
- 非自己生成的对象通过retain方法实现持有对象。
id obj = [NSArray array]; // 取得非自己生成并持有的对象
[obj retain];
- 调用autorelease后,对象不会被立即释放,而是注册到autoreleasepool中,知道pool结束,对象才被释放。
⚠️无法释放非自己持有的对象,但可持有非自己生成的对象。
三、ARC:自动释放自己持有的对象
释放方式:
1、赋其他值
2、超出作用域
所有权修饰符
- _ _strong
- id类型和对象类型默认
- 在超出变量作用域后被释放
_ _weak
- 解决循环引用问题(易发生互相强引用)
- 当引用计数为0时,自动赋值nil
- 必须是oc对象(assign可以非oc对象)
- weak被赋以一个非自己生成的对象,weak并不会立即释放,而是注册到AutoreleasePool中,延长生命周期。
- 不持有对象
- ⚠️与assign的区别
- assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能产生野指针。而weak一旦不适用,自动赋值nil。
_ _ unsafe_unretained
- _ _autoreleasing
- _ _strong
三、@autoreleasepool
- 由于main.m中的UI ApplicationMain永远不会return,所以main.m中的autoreleasepool永远不会进入到释放阶段,而UIApplicationMain会自己创建main run loop,在Cocoa的runloop中包涵autoreleasepool。
四、对象指针的返回值
- 划分
- retained return value -> 调用者拥有这个返回值。
- alloc \ copy \ init
- unretained return value -> 调用者不拥有这个返回值。
- retained return value -> 调用者拥有这个返回值。
五、对self.proprety直接赋值和间接赋值的差别
- 直接赋值:
self.proprety = [[NSObject alloc] init]; //init的时候retainCount+1 , 赋值的时候retainCount+1,但autoreleasepool只减1