iOS 內存管理基礎知識
內存管理問題,首先要知道一個概念,引用計數。Objective-C 的內存管理基于引用計數(Reference Count)。如果要使用一個對象,并希望確保在使用期間對象不被釋放,需要保證在使用過程中引用計數>0,在使用過后,把引用計數-1。當引用計數==0時,就會調用銷毀方法了。
那么我們非常有必要知道,哪些操作會使用引用技術+1,哪些會-1。OK,下面是一個列表:
+1操作
alloc - 創建對象是調用alloc,為對象分配內存,對象引用計數加一。、
copy - 拷貝一個對象,返回新對象,引用計數加一。
retain - 引用計數加一,獲得對象的所有權。
-1操作
release - 引用計數減一,釋放所有權。如果引用計數減到零,對象會被釋放。
autorelease - 在未來某個時機釋放。
autorelease是一個特別的方法,實際上是把release這件事交給了一個叫做自動釋放池(autorelease pool)的東西,在系統覺得需要清理的時候,才會調用release方法。由于交由系統來處理,所以可能release的時刻并不是那么及時,所以在一些必要的時候,我們還是需要自己手動去release.
此外還需要注意的一個地方,就是容器。NSArray,NSDictionary這些類,在添加對象的時候,會自動的把對象的引用計數+1,在自身銷毀的時候,又會把這些對象的引用計數-1.同理UIView對自己的subview也是這個樣子。
內存管理,我們需要遵循一些基本原則:
1.保證只有帶alloc,copy,retain的函數才會讓引用計數+1.
2.在對象的dealloc函數中釋放對象所擁有的實例變量。
3.永遠不要直接調用dealloc來釋放對象,完全依賴引用計數來完成對象的釋放。
4.在很多類方法可以直接創建autorelease對象。
5.在把一個參數傳遞出去的時候,因為要交由別人來釋放,一般設置成autorelease對象。