Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 内存警告和崩溃:如何处理_Iphone_Cocoa Touch_Memory Leaks - Fatal编程技术网

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

Iphone 内存警告和崩溃:如何处理,iphone,cocoa-touch,memory-leaks,Iphone,Cocoa Touch,Memory Leaks,我用仪器查看内存泄漏。至少在一个场景中,我经常浏览幻灯片/页面(在UIScrollView中),我没有看到任何内存泄漏。使用仪器-在“分配寿命”下,我切换到“已创建和仍在使用”,并查看整个内存约为1.17MB。我想这意味着我的应用程序只使用了这么多的实际内存,其余的都被正确回收 然而,在浏览了大约100页之后,我得到了一个内存警告,然后我的几个视图被卸载,导致整个应用程序崩溃 如果我没有使用大量内存并且没有内存泄漏,为什么会收到内存警告?因为没有什么我可以真正释放的,所以我看不到避免崩溃的方法。

我用仪器查看内存泄漏。至少在一个场景中,我经常浏览幻灯片/页面(在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)仍然知道这些图像。泄漏仪器将仅显示存在但未知的对象的泄漏

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

  • 在跟踪文档中选择ObjectAlloc工具,并按当前计数或当前总大小对类列表进行排序。您将看到大部分内存被UIImage对象占用

  • 如果将鼠标悬停在UIImage行的“类名”列上,将看到➲ (转到iTunes商店)图标;如果单击该按钮,您将看到所有UIImage实例的列表

  • 然后,如果您将鼠标移到实例行的地址列上,您将看到相同的按钮;这一次,单击它将带您进入该地址的历史记录,包括具有该地址的对象的所有创建、保留、发布和解除分配

    在这里,您可以看到映像的分配(在UIImage类中,由您按几个堆栈帧排序)、保留(由您)和释放(由您)。您还可以看到,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实例来了解这一点。