【问题标题】:Storyboards and memory management故事板和内存管理
【发布时间】:2012-08-23 08:32:20
【问题描述】:

我决定在我一直在做的项目中使用故事板。当应用程序启动时,它会执行awakeFromNib 然后viewDidLoad 的正确操作,但是当应用程序完成切换到另一个视图时,它不会调用viewDidUnload ,我认为,dealloc。我用过 Apple 的 Instruments 并没有显示任何内存泄漏。

请注意,我正在使用自定义 segue 并通过在方法中插入 NSLogs 来测试它。有没有其他人遇到过这个?

只想更新:dealloc 实际上被调用但不是viewDidUnload

【问题讨论】:

    标签: ios5 uistoryboard


    【解决方案1】:

    viewDidUnload 方法仅用于didReceiveMemoryWarning 的目的(即当视图被移除以恢复一些内存时,但视图控制器不是)。如果您想在模拟器中运行时看到 viewDidUnload,请将 ViewController 推送或呈现到辅助视图,然后从模拟器的菜单中生成内存警告。我引用UIViewController Class Reference

    当内存不足且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。 [viewDidUnload 方法] 在视图控制器的视图被释放后调用,这是您执行任何最终清理的机会。如果您的视图控制器存储了对视图或其子视图的单独引用,您应该使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但在视图消失后不再需要的任何对象的引用。您不应使用此方法发布用户数据或任何其他无法轻松重新创建的信息。

    调用此方法时,视图属性为 nil。

    【讨论】:

    • 即使-(void) dealloc 也没有被调用。通过performSegue:WithIdentifier 方法加载的特定视图控制器何时真正被释放??
    • @tGilani 视图控制器在您关闭或弹出它之前不会被释放(例如,调用 popViewControllerAnimateddismissViewControllerAnimated 或调用 unwind segue)。它不被释放的其他原因包括您维护一些其他强引用或强引用循环(例如,由于使用重复的 NSTimer 引起的)。
    • 你能在这里回答我吗..stackoverflow.com/questions/15545423/…
    【解决方案2】:

    viewDidUnload 在实际卸载视图时调用。如果您想在视图未显示时清理资源,请将其放入 viewDidDisappear

    如果您想查看 viewDidUnload 发生了什么,请在模拟器中运行您的应用,然后从菜单栏中选择 Hardware |模拟内存警告。

    在内存压力下,不在屏幕上的视图被删除,此时发送viewDidUnload 方法。

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 2011-11-18
      • 2013-08-26
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多