如若轉載,請註明源地址:http://blog.csdn.net/shinilaobababa/article/details/8453434
首先還是來一句OC中的內存管理的黃金法則比較好
如果對一個對象使用了alloc、[Mutable]copy,retain,那麼你必須使用相應的realease或者autorelease。(黃金法則就應該有金黃色的背景來襯托)
Objective-C的內存管理機制是比較靈活的,即可以完全的手動進行內存的管理,也可以用AutoreleasePool讓它升級爲半自動化的內存管理模式
1、cocoa中的內存管理機制——引用計數
引用計數(reference counting)又稱爲保留計數(retain counting),引用計數的數值表示有幾個其它對象在使用它。
每一個對象都擁有一個引用計數
當對象被創建的時候,引用計數的值爲1
當發送retain消息的時候,該對象的引用計數加1,該對象的引用計數爲2
當這個對象發送release消息的時候,該對象的引用計數減1
當一個對象的引用計數爲0時,系統自動調用dealloc方法,銷燬該對象。
- Dog *dog = [[Dog alloc]init];//此時引用計數爲1
- NSLog(@" %d",[dog retainCount]);
- [dog retain];//引用計數變成2
- [dog release];//引用計數變成1
- [dog release];//引用計數變成0,系統會自動調用dealloc方法,銷燬對象,回收內存
引用計數是實例對象的內存回收唯一參考
引用計數(retainCount)是Objective-C管理對象引用的唯一依據。調用實例的release方法後,此屬性減一,減到爲零時對象的dealloc方法被自動調用,進行內存回收操作,也就是說我們永不該手動調用對象的dealloc方法。
關於dealloc方法
它的作用是,當對象的引用計數爲0時,系統會自動調用dealloc方法,回收內存,它的一般寫法爲:
-(void)dealloc -(void)dealloc
{ {
[super dealloc]; [person release];
} [super dealloc];
}
在這裏爲什麼要調用父類的dealloc方法呢
子類的某些實例是繼承自父類的,因此,我們需要調用父類的dealloc方法,來釋放父類擁有的這些對象。
一般來說調用的順序是,當子類的對象釋放完時,然後再釋放父類的所擁有的實例,這一點與調用初始化方法,正好相反。
2、對象所有權當一個所有者(可以是任何一個OC對象)做了以下某個動作的時候,它就擁有了對一個對象的所有權。
(1)如果創建或者複製某個對象時,則擁有了該對象的所有權,即包含下列關鍵詞時:
alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:
(2)如果沒有創建或複製對象,而是保留引用,同樣擁有該對象的使用權
retain
(3)當擁有了某個對象的所有權,在不需要某一個對象時,需要釋放他們,用
release,autoRelease
3、自動釋放池的相關用法
(1)cocoa中的自動釋放池(Autorelease pool),是能夠自動釋放赤忠的對象的。NSObject類提供了一個autorelease消息,當我們想一個對象發送autorelease消息的時候,這個對象就會隨着釋放池的銷燬而釋放。如果要向使用使用自動釋放池釋放對象,我們首先要有一個入池操作:
- //創建自動釋放池
- @autoreleasepool {
- //入池對象5.0之後的寫法
- }
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
- //入池對象5.0之前寫法
- [pool release];
自動釋放池是以棧的形式實現的,當某個對象調用了autorelease方法時,該對象會被加入自動釋放池的棧頂。對於發送了autorelease消息的對象,當自動釋放池銷燬時,自動釋放池會對這些對象發送一條release消息,來釋放他們。
(2)向自動釋放池發送release及drain消息的區別
當我們向自動釋放池pool發送release消息時,它會向池中的每一個發送了autorelease消息的對象發送一條release消息,並且自身也會銷燬。當向它發送drain消息時,只會釋放裏面吧的對象,而不會銷燬自己。
4、關於ARC(Auto reference counting)自動引用計數
當你在編譯程序的時候提供自動管理內存的功能,它會自動加入內存的控制代碼,控制對象的生命週期,大大簡化了內存管理的步驟,ARC管理內容的原理就是,編譯器會在適當的地方自動插入retain、release和autorelease消息,但是注意版本,是在ios4及以上(不是很確定)。要使用此方法,可以在Xcode中創建項目時勾選,如圖
如圖:
在新建MAC的命令行程序時:
當在創建IOS工程時:
5、垃圾回收機制
類似與java中的垃圾回收機制,Objective-c在2.0以後也提供了垃圾回收機制,但是在IOS 中並不支持。但是我們要明白的是垃圾回收機制並不是ARC,ARC也是需要管理內存的,只不過是隱式的管理內存