<b>什么是引用計(jì)數(shù)?</b>
當(dāng)生成一個(gè)對象的時(shí)候,該對象的引用計(jì)數(shù)為1,當(dāng)持有者增加時(shí),引用計(jì)數(shù)增加,當(dāng)持有者釋放時(shí),引用計(jì)數(shù)降低。當(dāng)減少到為0時(shí),那么這個(gè)對象的內(nèi)存塊將會(huì)被釋放。
引用計(jì)數(shù)式內(nèi)存管理的思考方式:
1.自己生成的對象,自己持有。
2.非自己生成的對象,自己也能持有。
3.不再需要自己持有的對象要釋放。
4.非自己持有的對象無法釋放。
- 自己生成的對象,自己持有
使用 alloc,new,copy,mutableCopy的方法名,意味著自己生成的對象只有自己持有。
- 非自己生成的對象,自己也能持有
//取得非自己生成并持有的對象
id object = [NSMutableArray array];
/*
*取的對象存在,但是自己并不持有對象
*/
[object retain];//自己持有對象
- 不再需要自己持有的對象時(shí)釋放
id object = [[NSMutableArray alloc] init];
[object release];
/*
*釋放使用release
*/
-
無法釋放非自己持有的對象
對于用 alloc,new,copy,mutableCopy生成的對象,在不需要的時(shí)候要用release進(jìn)行釋放。而對于非自己持有的對象絕對不能進(jìn)行釋放,這樣會(huì)造成崩潰。在自己持有的對象釋放完不再需要的對象后,不能再次釋放。
<b>ARC有效時(shí)所有類型都必須加上所有權(quán)修飾符。所有權(quán)修飾符一共有四種: </b>
__strong 修飾符
__weak 修飾符
__unsafe unretained 修飾符
__autoreleasing 修飾符
- __strong 修飾符是id類型和對象類型默認(rèn)的所有權(quán)修飾符。_strong修飾符表示對對象的"強(qiáng)引用"
/*
* obj1持有對象A的強(qiáng)引用
*/
id __strong obj1 = [[NSObject alloc] init]; // 對象A
/*
* obj2持有由obj1賦值的對象A的強(qiáng)引用
* 此時(shí),持有對象A的強(qiáng)引用的變量有 obj1,obj2
*/
id __strong obj2 = obj1;
/*
* obj1對對象A的強(qiáng)引用失效
* 此時(shí),持有對象A的強(qiáng)引用的變量只有obj2
*/
obj1 = nil;
/*
* obj2對對象A的強(qiáng)引用失效
* 此時(shí),對象A的所有者不存在,廢棄對象A
*/
obj2 = nil;
- __weak修飾符表示對對象的"弱引用",因?yàn)?strong修飾符并不能解決"循環(huán)引用"的問題。當(dāng)A對B進(jìn)行強(qiáng)引用,B對A進(jìn)行強(qiáng)引用的時(shí)候,AB兩個(gè)對象將無法釋放。在用weak持有某對象的弱引用時(shí),若該對象被廢棄,那么此弱引用將自動(dòng)失效處于nil被賦值的狀態(tài)。
id __weak obj1 = nil;
{
id __strong obj0 = [[NSObject alloc] init];
obj1 = obj0;
}
/*
* obj0變量超出作用域,釋放自己所持有的對象。進(jìn)行廢棄該對象。
* obj1變量的弱引用失效,nil賦值給obj1。
*/
- __unsafe unretained 修飾符
unsafe unretained 修飾符的變量和weak修飾符的變量一樣,自己生成的并持有的對象不能繼續(xù)為自己持有,所以生成的對象會(huì)立即被釋放?,F(xiàn)在基本上不使用unsafe unretained 修飾符。
- __autoreleasing 修飾符
ARC有效不能使用autorelease方法。也不能使用NSAutoreleasePool類。但實(shí)際上,ARC有效時(shí)autorelease功能是起作用的。
在ARC無效與ARC有效的等價(jià)關(guān)系。

@autoreleasepool {
/*
* 取得非自己生成并持有的對象
*/
id __strong obj = [NSMutableArray array];
}
/*
* obj被釋放了
*/