自動引用計數(shù)(Automatic Reference Counting)是Objective-C默認的內(nèi)存管理機制震放,其針對堆上的對象小压,由編譯器自動生成操作引用計數(shù)的指令(retain或release),來管理對象的創(chuàng)建與釋放倡缠。
哪些對象受ARC管理
- OC對象指針
- Block指針
- 使用attribute((NSObject))定義的typedef
哪些對象不受ARC管理
- 值類型
- 使用其他方式分配的堆對象,如malloc
- 非內(nèi)存資源
ARC的操作規(guī)范或過程
- 新創(chuàng)建(new alloc copy)一個引用類型對象编整,引用計數(shù)為1
NSObject obj = [NSObject alloc]; - 如下操作會使引用計數(shù)加1(即retain操作):
//1.將對引用賦值給其它變量锦秒、常量、屬性散址、實例常量
NSObject obj2 = obj;
//2.將對象加入集合中
NSSet set;
[set addObject:obj];
//3.將對象傳遞給函數(shù)參數(shù)乖阵,或者返回值
void draw(BLNPoint *p){
NSLog(@"[%ld, %ld]",(long)p.x, (long)p.y)
} - 對象引用計數(shù)減1——release操作:
//1.將變量賦值為nil或其它值
obj = nil;
//2.屬性或?qū)嵗兞克诘膶ο蟊会尫拧⒒蛸x為其它值
//3.參數(shù)或局部變量離開函數(shù)
//4.將對象從集合中刪除
[array removeObjectAtIndex:0]; - 引用計數(shù)變?yōu)?時预麸,內(nèi)存自動被釋放瞪浸。
自動釋放池
當引用計數(shù)變?yōu)?時,對象會觸發(fā)release事件师崎,使內(nèi)存立即釋放默终。但是如果頻繁對對象進行release,可能會造成瑣碎的內(nèi)存管理負擔犁罩。autorelease可以將release的調(diào)用延遲到自動釋放池被釋放時齐蔽。
void poolDemo(){
@autoreleasepool {
for (int i = 0; i < 10; i++) {
__unused BLNRectangle *rect = [[BLNRectangle alloc]init];
}
}
}
什么時候需要手工管理自動釋放池
- 編寫的程序不基于UI框架,如命令行程序床估。
- 再循環(huán)中創(chuàng)建大量臨時對象含滴,需要更早的釋放,避免臨時對象聚集導致內(nèi)存峰值過大
- 在主線程之外創(chuàng)建新的線程丐巫,在新線程開始執(zhí)行處谈况,需要創(chuàng)建自己的Autorelease Pool。
- 可以嵌套使用Autorelease Pool