【问题标题】:iOS Storyboard Modal Segues and MemoryiOS Storyboard Modal Segues 和内存
【发布时间】:2013-09-03 16:06:38
【问题描述】:

我的应用“简短”描述:

基本上是一个交互式故事书,我有一个类来设置音频会话和音频播放器,我的应用程序中的每个其他类(ViewControllers)都会导入并调用一个或两个函数来设置每次发生时播放的正确声音(例如..用户阅读故事)。每个 ViewController 都有自己的 .m 和 .h 类,并将它们用于动画和动作处理。我的应用只有大约 60 mb 大小(音频/图像/代码)。

现在这些 ViewController 被设置在一个故事板中(它们现在是 13 个),并且从一个到下一个进行模态分隔,然后以编程方式将其关闭以返回。

当我现在在 iPad 上运行我的应用程序时,我开始收到内存警告,是的,Instruments 向我显示,我的应用程序为我选择的每个 ViewController 添加了大约 40 Mb 的内存。

我的问题是:

  1. 无论我做什么,它们都驻留在真实内存中吗? (我以为我没有对这些视图控制器持有任何强指针)。
  2. 是否有一种简单的方法可以让我解除一个控制器并仍然使用模态 segue 来访问下一个控制器?(尝试这样做时遇到了麻烦)
  3. Modal Segues 可能不是我应该在我的应用程序中做事的方式,是吗?!。对于我的“故事书”来说,它们看起来既漂亮又容易,但现在它们让我很艰难。
  4. 您可以根据我所描述的内容向我提供任何其他提示。

谢谢。

【问题讨论】:

    标签: iphone ios objective-c ipad uiviewcontroller


    【解决方案1】:
    1. 可以,只要您以模态方式呈现即可。演示者视图控制器保持一个指向所呈现视图控制器的强指针。你可以在这里做的是在 viewWillDisappear 中:释放所有可能使用内存的图像和其他视图!
    2. 您可以使用方法 instantiateViewControllerWithIdentifier: 实例化您的视图控制器,然后使用 presentViewController:animated:completion: 就像您对任何视图控制器所做的那样
    3. 由您决定。但是,如果您愿意,您可以轻松地模仿动画。
    4. 如果我正确理解了所有内容,我会选择一个类似于“AudioEngine”的单例类,它可以从任何类的任何位置访问。然后我会像你一样在我的故事板中设计我所有的视图控制器。当我需要以模态方式呈现另一个视图控制器时,我将使用您的第二个问题的答案来完成。如果我仍然有内存问题,我会尝试作弊并始终保留 3 个视图控制器(就像我们对 UIScrollView 的无限滚动所做的那样),我会重复使用它们,我将使用 UIView 的动画块来模拟模态演示。

    【讨论】:

    • 很好的答案,我试图很快实现 Nr.2,但我仍然无法从实际内存使用中释放任何内存......无论我关闭视图还是视图完成。这根本不是关于动画的,我只是想要一种从一个 ViewController 到下一个 ViewController 的好方法,而不会将所有以前的 ViewController 内容保留在内存中。我发现真正奇怪的是,即使我从模态 segue 或实例化的 ViewController 返回(关闭),我仍然没有恢复任何内存......
    • @Himmi 是的,这很奇怪。你试过在真机上使用 Instruments 吗?
    • 是的,这就是我正在做的。我正在使用 Instruments 来监控我的 iPad2。我在加载 ViewController 3/4 时收到内存警告(实际内存使用量约为 200-250 mb),然后在加载 ViewController 5/6 时强制我的程序关闭。当我使用dismiss返回时,该程序的实际内存使用量并没有降低。
    猜你喜欢
    • 2014-12-18
    • 2015-12-24
    • 2012-10-17
    • 2012-08-04
    • 2015-08-20
    • 2012-06-17
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多