Iphone 内存警告和崩溃:如何处理
我用仪器查看内存泄漏。至少在一个场景中,我经常浏览幻灯片/页面(在UIScrollView中),我没有看到任何内存泄漏。使用仪器-在“分配寿命”下,我切换到“已创建和仍在使用”,并查看整个内存约为1.17MB。我想这意味着我的应用程序只使用了这么多的实际内存,其余的都被正确回收 然而,在浏览了大约100页之后,我得到了一个内存警告,然后我的几个视图被卸载,导致整个应用程序崩溃Iphone 内存警告和崩溃:如何处理,iphone,cocoa-touch,memory-leaks,Iphone,Cocoa Touch,Memory Leaks,我用仪器查看内存泄漏。至少在一个场景中,我经常浏览幻灯片/页面(在UIScrollView中),我没有看到任何内存泄漏。使用仪器-在“分配寿命”下,我切换到“已创建和仍在使用”,并查看整个内存约为1.17MB。我想这意味着我的应用程序只使用了这么多的实际内存,其余的都被正确回收 然而,在浏览了大约100页之后,我得到了一个内存警告,然后我的几个视图被卸载,导致整个应用程序崩溃 如果我没有使用大量内存并且没有内存泄漏,为什么会收到内存警告?因为没有什么我可以真正释放的,所以我看不到避免崩溃的方法。
如果我没有使用大量内存并且没有内存泄漏,为什么会收到内存警告?因为没有什么我可以真正释放的,所以我看不到避免崩溃的方法。有人经历过这种情况或者知道我能做什么吗?我是不是曲解了仪器上的任何东西?非常感谢您的评论。找到了问题的根源。它在下面的代码段中
UIImage *image = [UIImage imageNamed:imageFile];
cartoon = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 40.0, 320, 280)];
cartoon.image = image ;
cartoon.backgroundColor = [UIColor brownColor];
我有100多张图片,每页上都有一些文字,用户可以通过手指轻弹来滚动浏览(就像iphone的照片应用程序中那样)。我只在UIScrollView中创建了3个页面,并加载/卸载(以及发布)我明确分配的所有内容。因此,在发布卡通时,我只是发布卡通UIImageView,而不是UIImage,因为我认为它会自动发布
但它似乎不是自动发布的。我的应用程序收到内存警告(我不采取任何行动),操作系统卸载我的视图导致崩溃
当我注释掉这两行(下面修改过的代码段)时,问题就消失了。没有警告,没有撞车
//UIImage *image = [UIImage imageNamed:imageFile];
cartoon = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 40.0, 320, 280)];
//cartoon.image = image ;
cartoon.backgroundColor = [UIColor brownColor];
有人知道如何解决这个问题吗?出现警告时,有没有办法强制从UIImage释放内存?
如果匹配的图像对象不在缓存中,此方法将从指定的文件加载图像数据,对其进行缓存,然后返回结果对象
因此,您使用imageNamed:
加载的每个图像在释放其最后所有权后将继续存在于缓存中
仪器没有显示这是泄漏,因为严格来说,这不是泄漏:有些东西(UIImage)仍然知道这些图像。泄漏仪器将仅显示存在但未知的对象的泄漏
不过,你仍然可以在仪器中看到这一点
+[UIImage imageNamed:][/code>缓存仍然拥有该图像,因此出现了“泄漏”
imageWithContentsOfFile:
和自己加载它们
更新:我了解到,自iOS 3以来,UIImage将在(至少在某些)内存不足的情况下清除其缓存,因此这不应该像以前那样成为“泄漏”。您可能仍然会看到内存堆积,但最终会看到内存堆积。如果您仍然看到内存堆积,并且可以证明这是苹果的错,那么您应该记录您的证据,并且。您是否将
NSZombieEnabled
环境变量设置为yes?它将导致解除分配的对象在内存中持久化,从而不允许您重新获得内存。因此,如果它处于活动状态,请尝试禁用它。您是否已选中释放所有对象?
在dealloc上,应该释放对象中的任何IBOutlet对象,即使它们没有合成方法
我们有一个类似的问题,我们已经解决了它释放所有的iboutlet
如果您只有3页,我知道您在重复使用某些项目 如果没有剩下的代码,很难说出哪里出了问题,但是也许你应该在创建一个新的卡通对象之前释放这个卡通对象 试着这样做:
IImage *image = [UIImage imageNamed:imageFile];
if (cartoon!=nil)
[cartoon release];
cartoon = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 40.0, 320, 280)];
cartoon.image = image ;
cartoon.backgroundColor = [UIColor brownColor];
仍然没有线索。也许“仪器”没有正确地报告一些我可能有的泄漏。还有其他更可靠的内存泄漏查找工具吗?它正在自动删除。它也被其他东西拥有。您可以通过查看仪器中的各个UIImage实例来了解这一点。