UIImagePickerController因内存压力而终止

时间:2014-08-18 17:03:18

标签: objective-c ios7 uiimagepickercontroller

我有一个UIViewController,它有:

@property UIImagePickerController* mainPicker;

并通过一个按钮,我提出了mainPicker,如:

- (IBAction)takePhoto:(UIButton *)sender
{
// Take a photo.

    if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
    // No camera is available, show an alert.

        UIAlertView* newAlert = [[UIAlertView alloc] initWithTitle:@"Warning"
        message:@"Camera is not available." 
        delegate:self 
        cancelButtonTitle:@"OK" 
        otherButtonTitles:nil];

        [newAlert show];

        return;
    }

    if(mainPicker == nil)
    {
        mainPicker = [[UIImagePickerController alloc]init];

        mainPicker.delegate = self;
        mainPicker.allowsEditing = YES;  //I've tried without this line, didn't affect at all.
        mainPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    }

    [self presentViewController:mainPicker animated:YES completion:nil];
}

第一个问题是;

Snapshotting a view that has not been rendered results in an empty snapshot. 
Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

此外,每当显示该视图控制器时,至少有两个内存警告。

拍照后,情况变得更糟。它实际上是垃圾邮件"收到内存警告。"。

这是一个乐器截图,希望它会有所帮助。

enter image description here

开头的内存大约是4 MB。拍照后,最高可达10 MB。在解雇的同时,我拯救了UIImage,因此在解雇后它已经接近30 MB。 (内存的峰值可能是由writeToFile引起的:另外,那个漏洞只有大约600字节)。

目前,我正在使用iOS 7在iPhone 5S上进行测试。

我已经尝试过启用僵尸,一段时间后调度选择器,允许/禁止编辑等等。它们都没有工作。此外,我还没有尝试在加载视图控制器后立即显示选择器视图。

补充说明,我已经使用了答案中的功能,这是日志;

Memory used  9588.7 (+9589), free 32063.5 kb
Memory used 10281.0 ( +692), free 18448.4 kb

Watching memory usage in iOS

在设备中看到32 MB的可用内存并不是很奇怪,而Instruments正在讲述另一个故事吗?

1 个答案:

答案 0 :(得分:1)

以下是一些可以帮助您解决问题的解释。

首先,Zombies诊断工具用于调试崩溃,其中正在访问已释放的内存。这似乎不是你的问题,因此僵尸工具对你来说对这个特殊问题毫无用处。

其次,您提供给我们的屏幕截图显示了Leaks乐器。您在该列表中看到的元素是您的程序已分配和忘记的对象,而不会事先释放它们。这意味着您没有任何单个剩余指针指向Instruments知道的内存。修复这些泄漏是修复内存警告的第一步。

第三,修复泄漏可能不足以修复内存警告问题。这些警告表明您使用的内存太多,无法满足iOS的需求。考虑到你的泄漏仅占600字节,问题似乎是你遗弃的内存。被遗弃的内存是您已分配的内存,即使它们可能不会被您的应用程序再次使用,您仍然可以使用实时引用。

为了帮助您解决问题,以下是使用仪器修复内存泄漏和废弃内存的相关文档:
https://developer.apple.com/library/mac/recipes/Instruments_help_articles/FindingMemoryLeaksinYourApp/FindingMemoryLeaksinYourApp.html#//apple_ref/doc/uid/TP40012965-CH32-SW1
https://developer.apple.com/library/mac/recipes/Instruments_help_articles/FindingAbandonedMemory/FindingAbandonedMemory.html

此外,这是一篇关于废弃内存的有用博客文章: http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/