Objective-C記憶體管理基礎知識

來源:互聯網
上載者:User

標籤:

記憶體管理原則:

  • 只要還有人在使用這個對象,那麼這個對象就不會被回收;
  • 只要你想使用這個對象,那麼就應該讓這個對象的引用計數器+1;
  • 當你不想使用這個對象時,應該讓對象的引用計數器-1;
  • 如果你通過alloc,new,copy來建立一個對象,那麼你就必須調用release或者autorelease方法;
  • 只要你調用了retain,最後都要調用release。

OC記憶體管理的範圍:

  • 管理任何繼承NSObject的對象,對其他的基礎資料型別 (Elementary Data Type)無效。記憶體管理主要是對堆區中對象的記憶體管理。本質原因是:Object Storage Service於堆中,其它局部變數主要存放於棧中,當代碼塊結束,其中所有局部變數會被回收,指向對象的指標也會被回收,此時對象已經沒有指標對象,但還存在於記憶體中,造成記憶體流失。

引用計數器的作用:

  • 引用計數器是判斷對象要不要回收的依據(存在一種例外:對象值為nil時,引用計數為0,但不回收空間)。

對引用計數器的操作

  • 給對象發送訊息,進行相應的計數器操作。
  • retain訊息:使計數器+1,該方法返回對象本身。
  • release訊息:使計數器-1,並不代表釋放對象
  • retainCount訊息:擷取對象當前的引用計數器值  %ld  

三種方法可以增加對象引用計數器的值:

  • 顯示使用alloc建立一個對象
  • 顯示使用copy[WithZone:]或者mutableCopy[WithZone:]拷貝對象
  • 顯示使用retain

對象的銷毀

  • 當一個對象的引用計數器為0時,那麼它將被銷毀,其佔用的記憶體被系統回收。
  • 在OC中,執行個體方法dealloc用來釋放對象中的執行個體變數指向的堆空間。
  • 當對象被銷毀時,系統會自動向對象發送一條dealloc訊息,一般會重寫dealloc方法,在這裡釋放相關的資源。
  • 一旦重寫了dealloc方法就必須調用[super dealloc];,並且放在代碼塊的最後。
  • 一旦對象被回收了,那麼他所佔據的儲存空間就不再可用,堅持使用會導致程式崩潰。

注意:

  • 如果對象的計數器不為0,那麼在整個程式運行過程,它佔用的記憶體就不會被回收。
  • 任何一個對象,剛生下來的時候,引用計數器都為1。當使用alloc.new.copy建立一個對象時,對象的引用計數器預設為1

自動釋放池:

  • 自動釋放池是OC的一種記憶體自動回收機制,可以將一些臨時變數通過自動釋放池統一回收釋放
  • 每當一個對象接收到autorelease訊息時,對象就會被放到自動釋放池中,當自動釋放池被釋放時,他裡面的對象會接收到一次release訊息
  • 當一個對象接收到autorelease訊息時,系統會把對象放到最近的自動釋放池中。當需要清空自動釋放池時,你可以向自動釋放池發送一個release訊息。
  • 簡單來說,當向一個對象發送autorelease訊息時,對象不會被立即釋放。
  • 使用autorelease需要注意:首先,發送過多的autorelease訊息,就和你發送太多的release一樣,當清空自動釋放池時,可能會引發記憶體故障。其次,雖然release訊息可以被替換為autorelease,但是出於對系統效能的考慮,可以使用release的地方盡量不要使用autorelease,因為自動釋放池所作的工作要比直接使用release多很多。最後,自動釋放池的延遲釋放機制可能會導致無用的記憶體消耗。
  • 在建立對象時,如果你沒有使用alloc,則不需要使用release或者autorelease。但是如果你顯示使用了alloc,則你不要忘記使用release或autorelease。
  • 當自動釋放池釋放時,自動釋放池中的對象 可能 會被釋放。這是因為,當自動釋放池釋放時,系統會給釋放池中的每一個對象發送一個release訊息,使得對象的引用計數器的值減1,如果對象引用計數器的值減為0了,則系統會向對象發送dealloc訊息徹底銷毀對象。

autorelease缺點:

  • 不能精確控制對象被銷毀的時間,拉長了對象的生命週期,記憶體處理效率降低。當不確定某個對象什麼時候要釋放時,或者操作的對象佔用記憶體比較小時,可以用autorelease,但當操作佔用記憶體比較大的對象時,要用release。一般情況下release優先使用。

Objective-C記憶體管理基礎知識

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.