内存警告和崩溃:如何处理它

cli*_*bon 7 iphone cocoa-touch memory-leaks

我使用仪器来查看内存泄漏.至少在我不断浏览幻灯片/页面的一个场景中(在UIScrollView中)我没有看到任何内存泄漏.使用乐器 - 在"Allocation lifespan"下,我切换到"Created&Still Living",并看到整个内存大约1.17MB.我认为这意味着我的应用程序仅使用这么多实际内存,并且正在正确回收其余部分.

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

如果我没有使用大量内存并且没有内存泄漏,为什么我会收到内存警告?由于没有什么我可以真正释放,我没有看到避免崩溃的方法.任何人都遇到这种情况或知道我该怎么办?我是否误解了乐器的任何内容?非常感谢任何评论.

Pet*_*sey 11

文件说:

如果匹配的图像对象尚未在缓存中,则此方法从指定的文件加载图像数据,对其进行缓存,然后返回结果对象.

因此,imageNamed:在您释放最后一个所有权后,您使用的每个映像将继续存在于缓存中.

仪器没有将其显示为泄漏,因为严格来说,它不是一个:Something(UIImage)仍然知道这些图像.泄漏仪器只会显示存在的物体的泄漏,但没有人知道.

不过,你仍然可以在乐器中看到这一点.

  1. 在跟踪文档中选择ObjectAlloc工具,并按当前计数或当前总大小对类列表进行排序.您将看到大部分内存被UIImage对象占用.
  2. 如果将鼠标悬停在UIImage行的类名列上,您将看到一个➲(转到iTunes商店)图标; 如果单击它,您将看到所有UIImage实例的列表.
  3. 然后,如果将鼠标悬停在实例行的地址列上,您将看到相同的按钮; 这一次,单击它将带您到该地址的历史记录,包括具有该地址的对象的所有创建,保留,发布和解除分配.

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

如果你不希望图像堆放这样,加载自己使用他们imageWithContentsOfFile:-[NSBundle pathForResource:ofType:]方法.

更新:我已经读过,自iOS 3以来,UIImage将在(至少某些)低内存情况下清除其缓存,因此这不应该像过去那样"泄漏".你可能仍然会看到记忆堆积起来,但是你最终会看到堆积崩溃.如果您仍然看到内存堆积并且可以证明这是Apple的错,那么您应该记录您的证据并提交错误.