2014-01-10 75 views
1

我有一個簡單的應用程序,它包含一個表格視圖,其中的每個單元格都有一個指向UIWebViewController的segue的側邊欄菜單(我正在使用SWRevealViewController)。因此,用戶可以打開邊欄並在各種配置的移動網站(除其他之外)之間切換。如何清理Storyboard Segues創建的UIViewController實例?

我已經正常工作,但我注意到,當我在側邊欄標籤之間來回切換時,在內存警告期間出現ping的控制器數量不斷增加。看來,每次切換標籤時都會創建一個新的UIWebVewController,除了框架代碼似乎保留了每個創建的控制器的列表並且永遠不會放開,導致內存不斷攀升。我敢肯定有,我可以清理名單的方式,但我還沒有找到它......

所以,我的問題是

  1. 它是什麼,是堅持到每個引用創建的UIViewController,以及哪裏可以找到/訪問?
  2. 我該如何清理?
  3. 什麼框架代碼/類負責調用didReceiveMemoryWarning:,這個人在哪裏得到需要接收警告的控制器列表?

在周圍搜索,我碰到this StackOverflow question,這暗示來了popViewControllerAnimated:可能是我可以清理不需要的控制器,但如何我不知道哪一個對象,我應該是在打電話,因爲我不知道上面#1或#3的答案...

回答

1

事實證明,在我的情況下,持有對我的控制器(問題#1)的引用是一個計劃的NSTimer,控制器正在使用本身作爲目標。爲了清理它(問題#2),我需要通過[myTimer invalidate]在離開控制器之前(在我的情況下,在viewWillDisappear:方法中)使計時器無效。

我還沒有找到問題3的答案,我仍然很想知道蘋果如何跟蹤哪些控制器仍然存在,因此需要存儲器警告,但問題3不是'這對我來說很重要,現在我的內存泄漏消失了。 :)

0

檢查SWRevealViewController是否持有它正在堆棧上推送的視圖控制器。通常你會爲你的ViewController創建一個UINavigationControllers字典,然後在你需要的時候使用字典來檢索UINavigationControllers。

+1

感謝您的答覆。 SWRevealViewController可能持有控制器,但即使它是,它也不是唯一持有引用的地方。蘋果的代碼就是調用didReceiveMemoryWarning的東西,因此,蘋果的代碼必須保存引用(或者蘋果正在調用委託方法來查找這些信息,如果是這樣的話,那是什麼方法?)。這是我需要清理的那些參考資料。如果蘋果永遠堅持,那麼這就是內存泄漏。必須有辦法告訴Apple的代碼,不再需要控制器,以便Apple可以放棄參考。 – Troy

相關問題