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

标签 iphone cocoa-touch memory-leaks

我使用仪器来查看内存泄漏。至少在一种情况下,我不断地翻阅幻灯片/页面(在 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/

相关文章:

iPhone 和 iPad 应用程序(同名 - 两个项目)...?

ios - 如何更改 MFMailComposeViewController 的标题颜色?

iphone - 当我删除我的 iOS 应用程序时,推送通知状态仍然存在

objective-c - KVO可以用来观察一个全局变量吗?

iphone - NSDictionary 没有正确存储 CGRect?

ios - 如何将核心数据中每个对象的小数值相加得出总数?

cocoa - 将 NSNumberFormatter 的负数格式从 (xxx.xx) 更改为 -xxx.xx

C 编程 - 返回指向 Freed 的指针

c++ - 如果我们不删除内存并且应用程序已经退出,是否存在内存泄漏

c++ - 使用 valgrind 查找 mysql c++ 客户端中的内存泄漏