2011-09-03 78 views
7

我知道在iOS的內存管理是棘手的,像我這樣的新手,但我希望在這裏我不能在其他地方找到一個清晰的解釋在這裏stackoverflow。autorelease與釋放dealloc

所以,假裝我有一個屬性/伊娃

@property(nonatomic, retain) UIPopoverController *popOver; 

這我分配是這樣的:

self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease];  

現在,在我的dealloc和viewDidUnload方法,我做兩個

// in viewDidUnload: 
self.popOver = nil; 
// in dealloc: 
[popOver release]; 

問題:

  1. 如果我在viewDidUnload/dealloc中執行nil/release,我真的需要在分配時自動釋放嗎?
  2. 反之亦然,如果我在分配autorelease,我需要零/釋放後?
  3. 有什麼區別?提前爲你的時間

謝謝 - 我會繼續讀書,認真內存管理不能是硬來包裝你的頭周圍...

+0

感謝您編輯標題;我看到類似的問題,前面有「iOS:」;實際上沒有它開始。 – pille

回答

5

不要通過該行的自動釋放混淆:

self.popOver = [[[UIPopoverController alloc] initWithContentViewController:popOverContent] autorelease]; 

該語句後您擁有有效的,因爲屬性setter聲稱它的所有權對象。自動釋放餘額爲alloc-init

所以...是的,你需要在分配時自動釋放。如果你這樣做(沒有自動釋放),你會泄漏:

self.popOver = [[UIPopoverController alloc] initWithContentViewController:popOverContent]; 

另一種方法是使用一個臨時變量,而不是autorelease:你需要釋放對象dealloc

UIPopoverController *temp = [[UIPopoverController alloc] initWithContentViewController:popOverContent]; 
self.popOver = temp; 
[temp release]; 

無論哪種方式。

+0

感謝Abizern&Yuji以及他們非常有啓發性的答案。我現在也明白Yuji的回答中描述的「地方所有權」的概念。無論如何,有什麼辦法來測試你的應用程序的內存泄漏(也許使用儀器)? – pille

+0

@pille是的,你可以使用[Instruments](http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Introduction/Introduction.html)。在Xcode中,[單擊並按住運行按鈕](http://stackoverflow.com/questions/5305906/xcode-4-running-the-leaks-instrument)或選擇[Product - > Profile](http:// stackoverflow的.com /問題/ 5304390 /儀器合的xcode-4)。這會彈出一個對話框,您可以選擇「泄漏」。 – albertamg

+0

@pille即使在使用儀器之前,只需執行「分析」,即在XCode的「構建」菜單下方可用。 – Yuji

4

1如果我做零/釋放viewDidUnload/dealloc,我真的需要autorelease在分配?

是的。

2反之亦然,如果我在分配時進行autorelease,是否需要以後無/發佈?

是的。

在第一種情況下,代表該方法完成自動釋放。該方法不再需要popover,所以它需要(自動)釋放它。

dealloc,您的對象不再需要popover。因此,你需要釋放它。

這很簡單。您不必考慮長期對象所有權;你只需要在每個方法的層面上進行本地思考。釋放與否的決定完全取決於該對象是否由程序的其他部分保存。在一種方法中,如果你分配一個對象,並且你不再需要它,那麼你(自動)釋放它。

dealloc是規則的輕微例外。在那裏,你需要釋放所有實例變量的所有權。

就是這樣!

1
  1. 是的。但在這種情況下可能不會。
  2. 是的。但在這種情況下可能不會。
  3. viewDidUnload在卸載視圖時調用,當視圖Controller被銷燬時調用dealloc

viewDidUnload你釋放了由觀點那些不再需要,可以在viewDidLoad中重新使用的對象。很顯然,由於未顯示視圖,因此無需保留視圖控制器爲其設置的對象。

dealloc您正在清理viewController並在這裏清除所有資源,包括它已分配給視圖的資源。

在這種情況下,視圖不擁有popover控制器 - 它應該由視圖控制器擁有,所以不需要在viewDidUnload中釋放它,但是您需要在dealloc中釋放它。

相關問題