cli*_*bon 7 iphone cocoa-touch memory-leaks
我使用仪器来查看内存泄漏.至少在我不断浏览幻灯片/页面的一个场景中(在UIScrollView中)我没有看到任何内存泄漏.使用乐器 - 在"Allocation lifespan"下,我切换到"Created&Still Living",并看到整个内存大约1.17MB.我认为这意味着我的应用程序仅使用这么多实际内存,并且正在正确回收其余部分.
然而,在浏览了100个左右的页面之后,我收到了内存警告,然后我的几个视图被卸载,导致整个应用程序崩溃.
如果我没有使用大量内存并且没有内存泄漏,为什么我会收到内存警告?由于没有什么我可以真正释放,我没有看到避免崩溃的方法.任何人都遇到这种情况或知道我该怎么办?我是否误解了乐器的任何内容?非常感谢任何评论.
Pet*_*sey 11
如果匹配的图像对象尚未在缓存中,则此方法从指定的文件加载图像数据,对其进行缓存,然后返回结果对象.
因此,imageNamed:
在您释放最后一个所有权后,您使用的每个映像将继续存在于缓存中.
仪器没有将其显示为泄漏,因为严格来说,它不是一个:Something(UIImage)仍然知道这些图像.泄漏仪器只会显示存在的物体的泄漏,但没有人知道.
不过,你仍然可以在乐器中看到这一点.
然后,如果将鼠标悬停在实例行的地址列上,您将看到相同的按钮; 这一次,单击它将带您到该地址的历史记录,包括具有该地址的对象的所有创建,保留,发布和解除分配.
在这里,您可以看到图像的分配(在UIImage类中,由您排序几个堆栈帧),保留(由您)和释放(由您).您还可以看到它尚未被UIImage释放 - +[UIImage imageNamed:]
缓存仍然拥有图像,因此"泄漏".
如果你不希望图像堆放这样,加载自己使用他们imageWithContentsOfFile:
和该-[NSBundle pathForResource:ofType:]
方法.
更新:我已经读过,自iOS 3以来,UIImage将在(至少某些)低内存情况下清除其缓存,因此这不应该像过去那样"泄漏".你可能仍然会看到记忆堆积起来,但是你最终会看到堆积崩溃.如果您仍然看到内存堆积并且可以证明这是Apple的错,那么您应该记录您的证据并提交错误.