NSAutoreleasePool 實現原理

概述 html

autorelease 是NSObject的一個類方法,它是經過調用[NSAutoreleasePool addObject:self] 來把一個對象添加到自動釋放池中的,由於這是一個類方法,因此有必要知道是對哪一個對象進行autorelease調用。 數組

NSAutoreleasePool 實例是保存在每個線程的stack中。當一個新pool建立,它就會進棧。當一個stack被銷燬的時候,它就出棧。 使用NSAutoreleasePool類方法時,須要從當前線程中獲取stack最上面的pool對象,來獲取當前pool。 併發

當找到正確的pool後,調用addObject: 實例方法來將對象添加到pool中。當對象被添加到pool中,其實他是添加到pool中的一個可變數組中去。 ui

當pool被銷燬時,pool會遍歷可變數組中的全部對象,併發送 release 方法給每個對象。還有一點額外說明,若是一個pool被銷燬,而且這個pool不是stack最上端的,這個pool還會銷燬該pool之上的全部pool。 spa

總結 線程

  • 沒有方法知道一個對象是否已經被自動釋放了。
  • 若是對象被autorelease 兩次,這個對象就會被兩次添加到pool中,當pool被銷燬,該對象就會被release兩次。
  • 自動釋放池的對象是噹噹前自動釋放池被釋放時被釋放。pool是當它的代碼顯性的銷燬它時而被銷燬。
  • 若是在一個線程上autorelease一個對象,並將它傳給另外一個線程,不會有特殊處理。當第一個線程池被銷燬的時候,該對象也會被release, 無論該對象在新線程發生了什麼。若是你須要繼續保留這個對象,就須要在傳遞以前retain這個對象。

原文連接:http://www.mikeash.com/pyblog/friday-qa-2911-09-02-lets-build-nsautoreleasepool.html htm

相關文章
相關標籤/搜索