iOS 內存管理基礎知識

cc68 9年前發布 | 10K 次閱讀 IOS 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對象。

 本文由用戶 cc68 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!