【问题标题】:How to debug large UIView memory allocation如何调试大的 UIView 内存分配
【发布时间】:2012-07-14 06:37:53
【问题描述】:

我正在尝试减少我的应用程序中的内存使用量,使用 Instruments 的分析表明 UIView drawLayer:inContext: 正在分配 2.25 MB。我假设分配是在调用我的代码之前完成的,并且是由于某处的 UIView 或 CALayer 大小不正确。但是我的代码都没有参与分配(见下图),因此我不知道如何调试它。我想我已经检查了我所有的视图和图层,我没有发现任何问题。

感谢任何想法!

【问题讨论】:

  • 几乎所有东西都在ios UIView中,不用担心
  • 我很担心,因为它分配了高达 2.25 MB 的空间,并且不再被取消分配。这很可能导致我遇到的内存不足崩溃。
  • 但是你使用的 UIViews 保留吗?如果你保留,你需要在dealoc(ARC结构)上设置nil
  • 如果我知道它是哪个 UIView,我可能会检查它是否应该在某个地方释放。知道如何找出它是哪个 UIView 吗?
  • 好吧,屏幕截图来自 Instruments,它没有显示代码,因为我的代码没有涉及。

标签: ios debugging memory uiview calayer


【解决方案1】:

iOS 应用程序不会在内存不足时突然崩溃——它们会卸载不需要的视图并向视图控制器发送内存警告。如果您的应用程序崩溃似乎与内存有关,请确保您正确处理内存不足的情况:实现 -didReceiveMemoryWarning-viewDidUnload 以删除您不需要的数据。

视图会占用大量内存。 UIViewController 将在需要时释放其视图,但如果您有另一个指向同一个视图的强/保留指针,您的视图控制器继承的功能将不知道释放它,并且视图永远不会被释放,即使这不是必需的。听起来这可能是您的情况,因为它是一大块内存,大小适合全屏视图。查看视图控制器以获取指向视图控制器视图(或任何其他视图)的其他指针,并确保将此类指针设置为 nil 或释放它们(取决于您是否使用 ARC)。

【讨论】:

    【解决方案2】:

    别担心。系统正在为恰好为 640 * 960 * 4 字节的层分配后备存储。

    如果您不泄漏层或视图,您最终会在视图被卸载时取回字节。

    【讨论】:

    • +1 完全正确 -- 2.25MB 几乎是查看屏幕大小减去状态栏所需的大小。
    • 嗯,我想你是对的。我想得还不够仔细。我想它实际上并没有那么大。这意味着我需要在别处找到我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多