2010-10-12 90 views
0

我有太多次釋放視圖的問題。雖然理論上很簡單,因爲我將uiview移動到uiview,uiview是uiview的一個子類,並且具有動畫效果等等,但這不是我可以輕易修復的。它只在一定條件下崩潰10%,即使在這些條件下也只有30%時間崩潰。由於保留計數而釋放對象

換句話說,它有點複雜。有時在我的dealloc方法中,這個UIView的保留計數已經是1(當視圖被釋放時它會被釋放),所以不應該再次被釋放。因此,我所做的是:

if ([mainView retainCount] > 1) { 
    NSLog(@"released"); 
    [mainView release]; 
} 

洽與釋放通常被稱爲崩潰,但並不總是和它發生相當多的時候我有時會想到它崩潰。我已經檢查了這個代碼的泄漏,並且它永遠不會泄漏。

現在的實際問題......由於其保留數量而釋放某些內容是否是錯誤的?我嘗試了很多不同的方法來解決這個問題,到目前爲止,這是唯一可靠且無泄漏的方法。

編輯:如果沒有那麼有什麼更好的方法來複制一個UIView到另一個UIView?

mainView = newView; 
[newView release]; 

我試着釋放mainView,然後調用newView上的副本,但這崩潰。除了保留計數有時候比預期的低1,即使它從來沒有在代碼中任何其他地方釋放,以上也是完美的。

回答

5

請勿使用retainCount值。

說真的,你應該從來沒有使用這個值的任何真正有用的這樣的。

如果您有內存泄漏,或者因過度銷售而遇到崩潰,請修復它們 - 它們是錯誤!這不是處理它們的方法。

編輯:總是很好看:Memory Management Guide

+0

更新的問題 – Rudiger 2010-10-12 07:16:21

+0

您需要展示更多代碼,並告訴我們您真正想要做什麼。複製視圖有點模糊。 – Eiko 2010-10-12 07:20:11

+0

沒有什麼更多。有兩個複雜的UIViews,如果我需要創建一個新的複雜視圖,我創建一個本地UIView,創建UIView的內容,在它們之間生成動畫getView = newView然後釋放newView。 – Rudiger 2010-10-12 07:22:58

0
mainView = newView; 

它不是一個副本,但分配。 retainCount將不會增加。那麼你不必做出發佈。

+0

這就是我想的,這就是爲什麼我試圖複製。但它崩潰。也這樣做不會泄漏,按預期工作,通常不會有保留計數問題。 – Rudiger 2010-10-12 07:26:54

+0

您不必複製視圖! – 2010-10-12 08:33:14

1

請勿使用-retainCount。

對象的絕對保留數是毫無意義的。

您應該致電release完全相同的次數導致對象被保留。沒有更少(除非你喜歡泄漏),當然,沒有更多(除非你喜歡崩潰)。

查看Memory Management Guidelines的全部細節。


在這種特定的情況下,荷蘭國際集團release當你沒有保留它的對象是一個災難。如果它現在不會崩潰,那麼有一天它可能是由於軟件更新或看似無關的更改。它可能現在只能工作,因爲你的內存管理在其他地方都是錯的。

正如有人說,這樣的:

mainView = newView; 
[newView release]; 

是不是使視圖的副本。更糟糕的是,它過度釋放視圖(因爲無處保留它)。

對視圖使用copy方法不是正確的解決方案,或者至少是非常不典型的解決方案。 UI元素不會以這種方式複製。

您是否嘗試過build and analyze並修復了它表示的任何錯誤?

leaks可能不會顯示任何內容,因爲可能仍然存在一個指向浮動在可訪問內存中的泄漏對象的指針。