1

我只是想知道以下兩種方法。將UIViewController添加到UINavigationController堆棧 - 正確的方法

第一:

SomeViewController *someViewController = [[SomeViewController alloc] init]; 
    [self.navigationController pushViewController:someViewController animated:YES]; 
    [someViewController release]; 

二:

SomeViewController *someViewController = [[SomeViewController alloc] init]; 
self.iVarViewController = someViewController; 
[someViewController release]; 
[self.navigationController pushViewController:self.iVarVierController animated:YES]; 

是否確定採取第一種方式,或者每個人都應該儘量採用第二?第一種方法到底出了什麼問題?當'someViewController'被推入堆棧時,其保留計數是否增加,因此永遠不會完全釋放?這就是爲什麼你可能想要像第二種方法那樣將它分配給屬性的原因?但在第二種方法中,您無法確定何時會發布。

我讀過similar post,但我還是有點不確定,所以想我會問更簡單。

回答

0

這兩種方法的後果略有不同。在第一個例子中,SomeViewController的實例及其視圖將在實例彈出後立即釋放。在第二種情況下,SomeViewController的實例將保留在內存中,直到它被替換爲新的(self.iVarViewController = someViewController)。

如果在第二個控制器彈出後第一個視圖控制器需要發送消息到第二個視圖(比如獲取更改的屬性值),第二種方法可能有意義。不過,在這種情況下,您不得不問自己每次重新創建對象是否有意義,而不是僅僅重複使用存儲在屬性中的實例(在您的示例中爲ivarViewController)。

其中一個比另一個更好取決於應用程序的這部分的預期使用模式以及第二個控制器和其視圖的性能特徵的組合。 (例如,對象消耗多少內存,以及用戶通常在兩個控制器之間來回切換的頻率?)

+0

太好了 - 謝謝你的詳細解釋,真的爲我清除它:) – Smikey 2010-11-20 16:23:46

1

他們都好。當您將SomeViewController推入堆棧時,其保留計數會遞增。當它從堆棧中彈出時,其保留計數會再次遞減。之後你不需要明確地釋放它。事實上,這可能會導致發生異常。

有一個簡單的通用規則:只要您撥打alloc/retain/new/copy*,您需要在某個時間撥打release

您只撥打alloc一次,因此您只需撥打release一次。

編輯:在第二種方法中,通過使用setter隱式調用retain。所以在這種情況下,稍後您需要額外的release以防止內存泄漏。

+0

我明白了,謝謝。很高興知道第一種方法是好的。但重新:你的編輯 - 當然,因爲我正在使用一個屬性,我不應該嘗試從dealloc方法中釋放它?否則,我不得不打電話給[self.iVarViewController發佈],大概你不應該那樣做? – Smikey 2010-11-20 14:35:47

相關問題