如何清理Storyboard Segues创建的UIViewController实例?

时间:2014-01-10 22:30:57

标签: ios iphone objective-c uiviewcontroller

我有一个简单的应用程序,它包含一个侧边栏菜单(我正在使用SWRevealViewController),其中包含一个表视图,其中每个单元格都有一个指向UIWebViewController的segue。因此,用户可以拉开侧边栏并在各种配置的移动网站(以及其他内容)之间切换。

我的工作正常,但我注意到,当我在侧边栏标签之间来回切换时,在内存警告期间被ping的控制器数量不断增加。似乎每次切换标签时都会创建一个新的UIWebVewController,这很好,除了框架代码似乎保留了每个创建的控制器的列表并且永远不会放弃,导致内存不断攀升。我确定有一种方法可以清理那份清单,但我还没有找到它......

所以,我的问题是

  1. 对于每个创建的UIViewController的引用是什么,我在哪里可以找到/访问它?
  2. 如何清理它?
  3. 哪个框架代码/类负责调用didReceiveMemoryWarning:,那个人在哪里获得需要接收警告的控制器列表?
  4. 在搜索时,我遇到this StackOverflow question,暗示popViewControllerAnimated:可能是我如何清理不需要的控制器,但我不确定我应该在哪个对象上调用它,因为我不知道上面#1或#3的答案......

2 个答案:

答案 0 :(得分:1)

事实证明,在我的情况下,持有对我的控制器(问题#1)的引用的东西是控制器用本身作为目标创建的预定NSTimer。要清理它(问题#2),我需要在离开控制器之前(在我的情况下,在viewWillDisappear:方法中)通过[myTimer invalidate]使计时器无效。

我仍然没有找到问题#3的答案,我仍然很想知道Apple如何跟踪哪些控制器仍然存在,因此需要内存警告,但问题#3不是现在我的内存泄漏已经消失,对我来说同样重要。 :)

答案 1 :(得分:0)

检查SWRevealViewController是否正在抓住正在推动堆栈的View Controller。通常你会为ViewController创建一个UINavigationControllers字典,然后每次需要时使用字典来检索UINavigationControllers。