【问题标题】:UIViews associated with memory leaks与内存泄漏相关的 UIView
【发布时间】:2010-11-19 13:13:26
【问题描述】:

我的 iPhone 应用程序的 GUI 使用了许多 UIView。用户在点击按钮前进或后退时“翻阅”这些视图。视图存储在屏幕外,仅在程序需要显示时才添加到实际视图中。

在翻转过程中,程序告诉父视图(一个 uiscrollview)使用 removeFromSuperView 方法删除任何现有的子视图,然后添加新的子视图,这是用户应该看到的新页面。

但是,在设备上多次重复此过程后,程序崩溃并显示 gdb 退出状态 101,我发现这是由内存不足错误引起的。

我尝试使用泄漏工具诊断此问题,但无济于事。只有 1 或 2 次小的内存泄漏,程序在设备上的总内存使用量仅为 2.5 mb。是否有可能是视频内存(而不是系统内存)运行不足?

我遇到了this 关于背景颜色和内存使用的帖子,但我需要进一步解释。我是否应该减少设置 backgroundColor 以防止 UIView 的 CALayer 占用过多内存?

【问题讨论】:

    标签: iphone objective-c memory-leaks


    【解决方案1】:

    您将所有这些视图存储在哪里?具体来说,当您翻阅这些视图时,您是否有一些数组 (NSArray)?

    除非它们的引用计数变为零,否则视图不会被释放。您的 `[[UIView alloc] init] 使引用计数为 1,将其添加为子视图使其为 2,将其从子视图中删除使其再次为 1。鉴于您没有被告知具体的泄漏,看来您并没有真正泄漏,而是将其存储在某个地方。

    【讨论】:

    • 是的,我使用 NSArray 将这些视图存储在屏幕外。总的来说,它们不会占用那么多内存,但是在我定期从主 ScrollView 中添加和删除 UIView 之后,就会出现内存问题。另一件需要注意的事情是,如果我在 2-3 个相同的视图实例之间来回翻页,则不会发生任何事情,并且一切正常。但是,如果我向前翻阅 10 个或更多视图,程序就会崩溃。感觉我几乎掌握了这个问题。
    • 如果不知道自己在做什么就很难说。所以,有两件事: 1. 添加一些代码来显示您在问题中所做的事情,以便我们可以更好地帮助您。 2. 我的猜测是您正在向该区域添加按需视图,并且当您翻阅更多“独特”视图(即您以前从未见过的视图)时,您会使用越来越多的内存。请尝试以下操作:在您调用 removeFromSuperview 的同一个地方,也调用 [yourArray removeObject:view];。如果这解决了您的问题,那么我们就知道问题所在,并且可以提出一个干净/合适的解决方案。
    • 在显示视图后从缓存中删除视图似乎可以防止内存问题的发生。首先,重要的是要注意所有视图都是在任何渲染之前初始化的。然而,虽然不再存在内存问题,因为视图在从滚动视图中删除后被释放,但程序不再具有翻页的能力。 (只能向前翻页)视图组件的实时初始化是这里最好的选择,还是有替代的解决方案?
    • 没有代码,几乎不可能说。通常,如果您不显示视图,则不应保留视图。相反,保存足够的状态以便您复活它们,然后创建一个新视图。因此,如果有人试图从视图 X 向后翻页,您需要加载视图 X-1。最后,为了避免加载时间/闪烁,如果用户想要查看视图 X,您应该预加载视图 X-1 和 X+1。这样一来,您始终处于领先地位。如果您发布一些您正在做的事情的示例代码,我将能够提供一些更具体的建议。
    • 这个建议解决了我的问题。我只是将模型存储在一个数组中,而不是实际的视图中。一开始我觉得立即渲染视图的开销太高了,其实不然。
    【解决方案2】:

    您可以访问苹果上的 iphone 示例代码吗?听起来 PageControl 示例代码程序是您正在寻找的一个很好的例子。并且示例代码程序没有内存泄漏或任何此类问题:) 链接here

    当您使用工具时,您是否检查过 ObjectAllocations?我发现它比泄漏工具更有用(对象分配是泄漏包括的工具之一)。我认为如果视频内存耗尽,那将是一个不同的错误,但我可能是错的。

    【讨论】:

    • Kiyoshi 绝对有正确的想法和正确的链接。我正在谈论的技术在 PageControl 示例中有所提及,但它们并不完整 - 您仍然必须删除未使用的子视图。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多