首先我们先看下非ARC的欢迎下,我们要怎么做。
1.内存管理的思考方式
自己生成的对象自己拥有
*.alloc
*.new
*.copy
*.mutableCopy
//自己生成并拥有对象
id obj = [[NSObject alloc]init];
<span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">非自己生成的对象,自己也能拥有</span>
<span style="font-family: Arial, Helvetica, sans-serif;">// 取得非自己生成的对象但自己不持有对象</span>
id obj16 = [NSMutableArray array];</span>
// 取得非自己生成的对象但自己持有对象
id obj16 = [NSMutableArray array];
//自己持有对象
[obj retain];
//自己生成并拥有对象
id obj = [[NSObject alloc]init];
//释放对象
[obj release];
//一般会在release 之后,将对象指针赋为nil;以避免指针悬空的情况
obj = nil;
//取得非自己生成的对象但自己持有对象
id obj = [NSMutableArray array];
[obj retain];
[obj release];
obj = nil;
非自己持有的对象无法释放
//自己的生成并持有的对象
id obj = [[NSObject alloc]init];
//释放对象
[obj release];
//一般我们要再release后,将对象指针置为nil;以免指针悬空的情况
obj = nil;
//释放之后再次释放 非自己持有的对象
[obj release];
//取得非自己生成的对象且自己不持有对象
id obj = [NSMutableArray array];
//释放了非自己持有的对象,会导致程序崩溃
[obj release];
口诀:1.谁污染谁自理,不是自己生成的对象不用管也不用释放
2.在存取方法中,要给对象retain,(后面要用的)
3.重写dealloc方法时,最后要调用[super dealloc]
4. 自己生成的对象作为函数返回值时,要把对象加到自动释放池(加autorelease)
ARC(automatic reference counting)情况下
1.强引用(拥有对象)(跳出作用域后失效回收,是不是自己生成的不重要只要是强引用就行了)
2.互相强引用易造成内存泄漏
3.对象被弱引用后,(报错,对象申请内存随既就被销毁)
4.__strong,__weak创建的变量,初始值为nil