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

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