了解ARC
ARC是iOS 5推出的新功能,全稱叫 ARC(Automatic Reference Counting)。簡單地說瑟啃,就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內(nèi)存管理的引用計數(shù)的代碼可以自動地由編譯器完成了周叮。
---哪些對象受ARC管理
*OC對象指針
*block指針
*使用_attribute(NSObject)定義的typedef
---哪些對象不受ARC管理
*值類型
*使用其他方式分配的堆對象
*引用計數(shù)管理
1)新創(chuàng)建(使用alloc,new,copy)一個引用類型對象,引用計數(shù)+1
2)對象引用計數(shù)增加+1-----retain操作
將對象引用賦值給其他變量或常量時
將對象引用賦值給其他的屬性或者實例變量
將對象傳遞給函數(shù)參數(shù)或者返回值
將對象加入集合里面
3)對象引用計數(shù)減-1
將局部變量或全局變量賦值為nil或者其他值
將屬性賦值為Nil或者其他值
實例屬性所在的對象被釋放
參數(shù)或局部變量離開函數(shù)
將對象從集合中刪除
4)引用計數(shù)為0時界斜,內(nèi)存自動被釋放
retain, release, autorelease, dealloc由編譯器自動插入仿耽,不能在代碼中調(diào)用
dealloc雖然可以被重載,但是不能調(diào)用[super dealloc]
void arcDemo(){
BLNPoint *p1 = [[BLNPoint alloc]init];
BLNRectangle *rect = [[BLNRectangle alloc]init];
// --------------- 引用計數(shù) retain +1操作
BLNPoint *p2 = p1;//r(2)
rect.center = p1;//r(3)
draw(p1);
array=[[NSMutableArray alloc]initWithCapacity:10];
[array addObject:p1];//r(4)
// --------------- 引用計數(shù) release -1操作
p1 = nil;//r(3)
p2 = nil;//r(2)
rect.center = nil;//r(1)
[array removeObjectAtIndex:0];//r(0)
NSLog(@"continue......");
}
參考
http://blog.csdn.net/likendsl/article/details/10900469
自動釋放池(autoreleasepool)
*release會導(dǎo)致對象立即釋放各薇。如果頻繁對對象進行release项贺,可能會造成瑣碎的內(nèi)存管理負擔,aotorelease可以將release的調(diào)用延遲到自動釋放池被釋放時得糜。
*推薦使用自動釋放池BLock敬扛,當其結(jié)束時,所有接受autorelease消息的對象會被立即釋放朝抖。
*AppKit和UIKit框架在處理每一次事件循環(huán)迭代時啥箭,都會講其放入一個AutoRelease Pool中,絕大多數(shù)情況治宣,無序程序員干預(yù)急侥。
//及時早一點的被釋放
void poolDemo(){
@autoreleasepool {
for (int i = 0; i < 10; i++) {
__unused BLNRectangle *rect = [[BLNRectangle alloc]init];
}
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"-------ARC Demo: ----------");
arcDemo();
NSLog(@"-------Autorelease Pool Demo: ----------");
poolDemo();
}
return 0;
}