2011-11-22 80 views
0

我有一個例程來正確分配和取消分配我的UIView子類,但是當我在類的- (void) dealloc中設置斷點時,我看到它不被調用,I有一個巨大的內存泄漏。瞭解保留和釋放以外的方法對保留計數的影響

所以我在發佈之前打印retainCount,它是2(這可能是正常的,因爲其他對象可以使用它)。我搜索並沒有看到任何其他retain消息。然後我發送:

[myObject removeFromSuperview]; 

現在它被釋放。這讓我意識到,前面我發:

[self.view bringSubviewToFront:myObject]; 

是很難知道,當我使用bringSubviewToFront:,我總是要打電話removeFromSuperview。有沒有其他方法可以增加保留數?

如果這個對象不是子類,並且只是一個UIView,我就不會知道我創建了內存泄漏。

那麼,我怎麼才能真正知道我的對象已經發布,並且內存是免費的?

知道發生了什麼並不重要,但我想知道我正在創建和刪除對象。這裏有一個演示,說明使用和不使用removeFromSuperview的相同代碼會導致我看到的效果 - 這是我的日誌。

當我做使用removeFromSuperview

Memory used 16687.1 (+5378), free 262213.6 kb 
Memory used 19451.9 (+2765), free 257159.2 kb 
Memory used 19451.9 ( +0), free 259530.8 kb 
Memory used 21844.0 (+2392), free 257830.9 kb 
Memory used 24313.9 (+2470), free 256356.4 kb 
Memory used 25260.0 ( +946), free 253141.0 kb 
Memory used 27848.7 (+2589), free 252874.8 kb 
Memory used 30142.5 (+2294), free 250814.5 kb 
Memory used 30814.2 ( +672), free 247787.5 kb 

可以看到內存的使用不僅增加了,但是當我使用它:

Memory used 16105.5 (+4829), free 262619.1 kb 
Memory used 16527.4 ( +422), free 262815.8 kb 
Memory used 14168.1 (-2359), free 262832.1 kb 
Memory used 16769.0 (+2601), free 263266.3 kb 
Memory used 16560.1 ( -209), free 264785.9 kb 
Memory used 14200.8 (-2359), free 264794.1 kb 
Memory used 16789.5 (+2589), free 264290.3 kb 
Memory used 16597.0 ( -193), free 264499.2 kb 
Memory used 14237.7 (-2359), free 264515.6 kb 
Memory used 16609.3 (+2372), free 264290.3 kb 
Memory used 16560.1 ( -49), free 264425.5 kb 
Memory used 14200.8 (-2359), free 264441.8 kb 

現在內存的增加和像我想要的那樣下降。

我從https://stackoverflow.com/q/7990532/632472得到了記錄內存使用情況的代碼。

+0

笑..我有一些問題,英語語法:( – Rodrigo

回答

2

你在做這樣的事嗎?

self.subView = [[UIView alloc] init]; 

如果是這樣,那可能是你的問題。保留計數爲2.一次爲alloc,一次爲屬性集。您可能要考慮增加一個呼叫自動釋放

self.subView = [[[UIView alloc] init] autorelease]; 
1

沒有要求在致電bringSubviewToFront:後致電removeFromSuperview。只有你要求釋放你保留的內容。當您想從其視圖層次結構中刪除視圖時調用removeFromSuperview。它也稱爲release是無關緊要的。

更有可能在這裏你有一些其他過度保留myObject。你總是使用訪問器爲你的ivars?直接訪問ivars(init和dealloc除外)是內存泄漏的最常見原因。如果myObject沒有存儲在ivar中,那麼運行分析器以確保你沒有在更明顯的地方過度保留myObject。 (分析器對理解ivars很不好,但使用訪問器通常會修復這些問題。)

+0

我編輯的職位,並把一些數據。因爲我看到這個我得出的結論我必須調用'removeFromSuperView' – Rodrigo

+0

我並不是說你沒有泄漏,我說的是removeFromSuperview可能會掩蓋泄漏,你的泄漏更可能在其他地方。@ dar512有一個很好的例子泄漏。 –

1

我以爲,在某個地方,在你的代碼中被加入該對象的視圖,類似的東西:

[self.view addSubview:myObject]; 

如果是這樣,這就是因爲任何UIView都會保留它的內容。其實來電

[myObject removeFromSuperView]; 

確實爲你釋放魔法...