在程式設計語言中是少不了對記憶體的管理的,記憶體對于計算機來說是寶貴的資源,是以對使用不到的資源進行回收是很有必要的。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表示弱引用。