首先明確一點什么是自動引用計數(shù)
自動引用計數(shù)器是在ios5以后增加的一項內(nèi)存管理機制,是指內(nèi)存管理中對引用采取自動計數(shù)的一項技術(shù)颠印,讓編譯器來進行內(nèi)存管理。
在LLVM編譯器中設(shè)置ARC為有效狀態(tài)抹竹,就無須再次鍵入retain线罕、release
</br>
內(nèi)存管理的是思考方式
- 自己創(chuàng)建的對象,默認自己持有
- 非自己創(chuàng)建的對象窃判,retain后也能夠持有
- 自己持有的對象钞楼,在不需要的時候需要釋放
- 不是自己持有的對象,不能釋放
</br>
那么什么才叫做是“自己創(chuàng)建”的類呢袄琳?
使用以下名稱開頭的方法意味著是自己創(chuàng)建的對象并持有的對象:
1. alloc
2. new
3. copy
4. mutableCopy
另外根據(jù)類似“使用以下名稱開頭的方法名”(實現(xiàn)方法中是以上述方法重寫)询件,下列名稱也意味著自己創(chuàng)建自己持有。
1. allocMyObject
2. newTheClass
3. copyThis
4. mutableCopyThat
自己創(chuàng)建的對象唆樊,自己持有宛琅,自己釋放
/*
* 創(chuàng)建時
*/
//自己生成對象并持有對象
id obj = [[NSObject alloc] init];
/*
* 持有對象
*/
// 自己創(chuàng)建不需要retain就已經(jīng)持有
/*
* 釋放時
*/
//自己創(chuàng)建的對象,需要自己去釋放
[obj release];
// 釋放后的 指向?qū)ο蟮闹羔樢廊槐4嬖趯ο髈bj中窗轩,但一旦釋放絕對不能再訪問
非自己創(chuàng)建對象夯秃,在持有后,可以釋放
/*
* 創(chuàng)建時
*/
//取得非自己生產(chǎn)的對象,但暫時并不持有
id obj = [ NSArry arry ];
/*
* 持有對象
*/
[obj retain];
/*
* 釋放對象
*/
//對自己持有的對象仓洼,如果不需要再使用介陶,持有者需要去釋放
[obj release];
非自己持有的對象色建,不能去釋放
- (id)object{
/*
* 自己持有對象
*/
id obj = [[NSObject alloc] init ];
/*
* 取得的對象存在哺呜, 但自己不持有對象
*/
//需要使用到autoRelease是因為obj需要在沒有持有的狀態(tài)下被釋放,而現(xiàn)在我們設(shè)計object方法所創(chuàng)建的對象是不持有的箕戳,這樣就說明最后retain的對象是無法主動release obj某残。所以需要借助autoRelease來釋放obj,這樣既延長了obj的生命周期陵吸,又保證在不需要的時候釋放obj
[obj autoRelease];
return obj;
}
NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];
NSLog(@"mStr:%p,%p", mStr,&mStr);
//mstr 打印%p輸出的是 mstr指向的是@“abc”的首地址
//&mStr 輸出的是mstr自己保存在內(nèi)存中的地址