【问题标题】:iPad Memory Usage Constantly IncreasesiPad 内存使用量不断增加
【发布时间】:2011-06-14 21:13:48
【问题描述】:

我正在编写一个 iPad 应用程序,它使用大量视频和大型 PNG 动画序列,并注意在不再需要时释放所有资源。 Instruments 显示没有内存泄漏,allocations 显示应用程序从未分配超过大约 30 MB。但是,当我查看 Activity Monitor 时,我发现实际内存和虚拟内存在不断增加,越深入应用程序的内容。我将 NSLogs 放在我所有的 dealloc 方法中,并且我释放的每个对象都被释放。但是,我的应用程序被信号 0 杀死。有人有什么建议吗?

【问题讨论】:

  • 用仪器检查一段时间后哪些物体还活着。

标签: objective-c ipad memory-management memory-leaks instruments


【解决方案1】:

WWDC 2011 session 318 视频“iOS Performance in Depth”(大约 43 分 50 秒)描述了 UIImageView 中的 UIImage 动画如何消耗大量内存。他们建议在为大图像制作动画时使用

- (void) animateImages
{
   CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateImage:)];
}

- (void) animateImage:(CADisplayLink *)link
{
   [imageView setImage:[UIImage imageWithContentsOfFile:nextImagePath()]];
}

无法保证动画速度。使用 +[UIImage imageWithContentsOfFile:] 是关键,因为 +[UIImage imageNamed:] 将缓存图像实例。

我在我的应用程序中使用了这种技术,在大图像动画集之间切换时内存不足,并且在 iPhone 3GS 和 iPhone 4S 上运行良好且流畅。在 iPhone 3GS 上速度很慢,但 3GS 以前甚至连一组动画都做不了。查看 VM Tracker 中的 Dirty Size 统计数据,差异是巨大的。

【讨论】:

    【解决方案2】:

    可能是您启用了 NSZombieEnabled 吗?曾经发生在我身上...

    【讨论】:

    • NSZombieEnabled 设置为 NO。
    【解决方案3】:

    您可能已经这样做了,但是在使用 Allocations 工具时,请在与 UI 交互时使用“Heap Shots”。这将使您了解在每个时间间隔内分配了什么以及对象的生命周期。 Bill Bumgarner 有一个excellent blog entry 关于这个非常值得一读的强大工具。

    【讨论】:

    • 对于每个堆快照,Instruments 显示不到 100 KB 的增长。然而,每次我更改应用程序的状态时,我在 VM Tracker 中的脏大小、驻留大小和虚拟大小都会显着且持续地增长(大约 11 MB)。不过,正如我在原帖中所说,我发布的每个自定义对象都将被释放。
    • 哦,我也没有收到任何低内存警告。
    • 您是在模拟器上运行还是在实际设备上运行?
    • 我在实际设备上运行。
    • 在我所有的 UIImageViews 上,在 [imgView release] 之​​前调用 [imgView.image release],imgView = nil 会导致 VM Tracker 中脏大小、驻留大小和虚拟大小的增长要小得多,仅供参考,但它们仍在增长。
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多