gpt4 book ai didi

iphone - 内存警告并崩溃: how to handle it

转载 作者:行者123 更新时间:2023-12-03 18:38:09 25 4
gpt4 key购买 nike

我使用仪器来查看内存泄漏。至少在一种情况下,我不断地翻阅幻灯片/页面(在 UIScrollView 内),我没有看到任何内存泄漏。使用仪器 - 在“分配生命周期”下,我切换到查看“已创建且仍然存在”,并看到内存大约为 1.17MB。我认为这意味着我的应用程序只使用了这么多的实际内存,其余的内存正在被正确回收。

然而,在浏览了 100 个左右的页面后,我收到了内存警告,然后我的几个 View 被卸载,导致整个应用程序崩溃。

如果我没有使用大量内存并且没有内存泄漏,为什么我会收到内存警告?由于我没有什么可以真正释放的,所以我看不到避免崩溃的方法。有人经历过这种情况或者知道我能做什么吗?我是否误解了 Instruments 中的任何内容?非常感谢您的任何评论。

最佳答案

The documentation says:

If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.

因此,您使用 imageNamed: 加载的每个图像在您释放最后的所有权后将继续存在于缓存中。

Instruments 不会将其显示为泄漏,因为严格来说,这不是泄漏:某些内容 (UIImage) 仍然了解这些图像。 Leaks 工具只会显示存在但一无所知的对象的泄漏。

不过,您仍然可以在 Instruments 中看到这一点。

  1. 在跟踪文档中选择 ObjectAlloc 工具,并按当前计数或当前总大小对类列表进行排序。您将看到大部分内存被 UIImage 对象占用。

  2. 如果将鼠标悬停在 UIImage 行的类名列上,您将看到一个 ➲(转到 iTunes-Store)图标;如果单击它,您将看到所有 UIImage 实例的列表。

  3. 然后,如果您将鼠标悬停在实例行的地址列上,您将看到相同的按钮;这次,点击它将带您进入该地址的历史记录,包括该地址的对象的所有创建、保留、释放和释放。

    在这里,您可以看到图像的分配(在 UIImage 类中,由您向下几个堆栈帧排序)、保留(由您)和释放(由您)。您还可以看到它尚未被 UIImage 释放 - +[UIImage imageNamed:] 缓存仍然拥有该图像,因此“泄漏”。

如果您不希望图像像这样堆积起来,请使用 imageWithContentsOfFile:the -[NSBundle pathForResource:ofType:] method 自行加载它们。 .

更新:我读到,自 iOS 3 起,UIImage 将在(至少某些)低内存情况下清除其缓存,因此这不应该是“泄漏”以前是。您可能仍然会看到内存堆积,但最终您应该看到内存堆崩溃。如果您仍然看到内存堆积并且可以证明这是苹果的错,您应该记录您的证据并 file a bug .

关于iphone - 内存警告并崩溃: how to handle it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com