首先我們先看下非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