天天看點

Objective-C中的記憶體管理

        在程式設計語言中是少不了對記憶體的管理的,記憶體對于計算機來說是寶貴的資源,是以對使用不到的資源進行回收是很有必要的。oc中使用引用計數和垃圾回收來管理記憶體,在oc中為每個對象配置設定一個引用計數器,當對象剛剛被建立時其初始值為1,當有某段代碼需要通路一個對象是時,會将該對象的引用計數器加1(通過retain來實作);當通路一個對象結束時,會将該對象的引用計數器減1(通過release來實作);當計數器為0時,該對象占用的記憶體空間會被收回。在nsobject類有一個retaincount方法,調用該方法可擷取目前對象的引用計數值。

        在xcode4以後的版本采取自動引用計數(automatic reference counting)簡稱arc, 預設的是arc模式,在arc下是不能直接調用retain,release, releasecount等方法的,需要在xcode中進行設定,設定如下: 把objective-c automatic reference counting 改為no,即可。

    ​    ​之前提到的nsoject類裡有個方法,retaincount可以擷取目前對象的引用計數的值,廢話少說上點代碼吧。

    ​    ​1. 用可變的數組結合着可變的字元串來觀察一下retaincount的變化。

    ​    ​    ​(1).先建立一個可變數組對象,在建立一個可變字元串對象;

    ​    ​    ​(2).然後往可變數組裡添加可變的字元串,觀察可變字元串的retaincount的變化。

    ​    ​    ​(3).在可變數組中移除一個str,觀察retaincount的變化

    ​    ​    ​(4)我們為什麼要用可變的字元串呢?稍後會提到為什麼。

   ​    ​    運作的結果:

    ​2.nsstring的retaincount的變化

    ​    ​    ​用nsstring聲明的字元串變量的retaincount變化由你初始化字元串時的方式決定

    ​    ​    ​1. 用nsstring *str = @"ludashi";定義變量

    ​    ​    ​    ​用上面的方法定義的字元串是常量字元串,他的retiancount為-1或不定,不會随着retian或者release變化而變化

    ​    ​    ​    ​demo如下:

    ​    ​    ​運作結果:

   ​    ​    ​2.使用stringwithformat建立的nsstring為變量,系統會進行引用計數。

    ​    ​    ​demo:

    ​    ​    ​3 .stringwithstring取決于後面跟的string, 後面string的retaincount是多少那麼用stringwithstring建立的對象就為多少

    ​    ​    ​    ​demo:

    ​    ​    ​運作結果:

    ​objective-c中得arc(automatic reference counting)

    ​    1.​arc中應注意的問題:

    ​    ​    ​(1). 不能顯式調用dealloc語句, 或者實作或調用retain, release, retiancount 和 autorelease等方法。

    ​    ​    ​(2).不能調用@selector (retain) ,@selector (release)等;

    ​    ​    ​(3).不能使用nsautoreleasepool對象, 用@autoreleasepool塊來代替;

    ​    ​    ​(4).不能用開頭new的名稱來定義一個屬性,除非你定義一個别的getter名稱。

    ​    ​

    ​    ​2.arc特性

    ​    ​    ​arc增加了新的屬性定義關鍵字,strong來代替retain,表示強引用。用weak來代替assign表示弱引用。

繼續閱讀