2010-11-02 27 views
0

閱讀後: Memory management of a view controller in Objective-c整蠱內存管理

Does UIView's addSubview really retain the view?

我寫了下面的代碼來切換子視圖:

@synthesize switchableView, viewSelector, currentSubview; 

//... 

if(switchableView.subviews.count != 0) 
[[switchableView.subviews objectAtIndex:0] removeFromSuperview]] 
self.currentSubview = (veiwSelector.selectedSegmentIndex == 0) ? 
[ViewA new] : [ViewB new]; 
[switchableView addSubview:currentSubview.view]; 

//[currentSubview release]; //<---crashes if I uncomment this line 

它似乎運行很好,如果我註釋掉這條發行版,但我無法繞過原因。這是我理解的方式會發生什麼,也許有人可以告訴我在哪兒出錯:

所以,讓我們考慮currentView:

  • 一個由「新」的消息得到的alloc-ED - 保留計數=答:1

  • 甲得到由設定器保持 - 保留計數= A:2

  • A的視圖獲得(假定)保留 - 保留計數= A:2.1

下一次通過...

  • A的子視圖得到釋放計數= A:2

  • 乙通過 '新的' 消息獲取的alloc-ED - 保留計數= B:1 1,A:1

  • - ,A::1,A:2

  • 甲得到由setter--乙自動釋放乙1個

  • B獲得由設定器保持

  • 什麼都沒有擺脫A?

所以我要改變我的代碼,還是我錯了的方式存儲管理工作在這種語言...或兩者 -

+1

你有一個額外] removeFromSuperview – robev 2010-11-02 20:41:07

回答

0

您對保留和釋放的理解是正確的,您的代碼也是如此。這表明問題出在您發佈的代碼之外。例如,如果您的currentSubView屬性定義爲assign而不是retain,則會出現此問題。

但是,您的代碼結構不夠好。這將是更加清晰:

self.currentSubView = [[ViewA new] autorelease]; 

此外,圖控制器意在被高速緩存,而不是創建並且每個用戶切換顯示時間釋放。通常,您事先創建視圖控制器,並在必要時訪問其.view屬性以顯示視圖。 UIViewController將在低內存條件下自動釋放不可見視圖,並在訪問.view屬性時重新分配其視圖。

5

好吧,一步一個,忽略retainCount。這是蘋果應該重新命名爲lsdjiofsudfoiwjeriowhfiuwhrteiuhweifhsdjkfhsiurwoieuriosfho之類的東西之一,所以人們不會猜出它的名字,也不會在文檔中列出它。出於你的目的,這完全沒用,所以不要理它。

現在我已經說了,讓我們考慮一下:addSubview:是否保留它的參數,並且removeFromSuperview釋放接收器。

最後,很難說什麼currentSubview是。它有一個view財產,它會傾向於一個VC,但是,你自己使用它的方式,將表明它是一個正常的觀點。也許你可以澄清,所以我可以繼續我的答案。

+2

+1後'retainCount' – PostMan 2010-11-02 20:39:47

+0

其視圖控制器 – pseudopeach 2010-11-02 21:42:20

+0

lsdjiofsudfoiwjeriowhfiuwhrteiuhweifhsdjkfhsiurwoieuriosfho ...檢查!那麼你在O-C中遵循什麼規則?因爲顯然,整個釋放或自動釋放你分配的所有東西都是一堆垃圾。 – pseudopeach 2010-11-02 21:49:41

0

更改釋放行

self.currentSubview = nil; 

,我想你會沒事的。您正在釋放,但不會將該屬性設置爲零。因此,下次重新分配時,將再次調用釋放。但是你已經發布了它,所以......繁榮。