Objective-c中的內存管理的黃金法則,OC中最重要的部分

如若轉載,請註明源地址: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方法,銷燬該對象。

  1. Dog *dog = [[Dog alloc]init];//此時引用計數爲1  
  2. NSLog(@"  %d",[dog retainCount]);  
  3.   
  4. [dog retain];//引用計數變成2  
  5.   
  6. [dog release];//引用計數變成1  
  7. [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消息的時候,這個對象就會隨着釋放池的銷燬而釋放。如果要向使用使用自動釋放池釋放對象,我們首先要有一個入池操作:

  1. //創建自動釋放池  
  2. @autoreleasepool {  
  3.           
  4.     //入池對象5.0之後的寫法  
  5.           
  6.     }  

  1. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];  
  2.   
  3.    //入池對象5.0之前寫法  
  4.   
  5. [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也是需要管理內存的,只不過是隱式的管理內存

發佈了12 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章