Objective c UIImagePickerController由于内存压力而终止

Objective c UIImagePickerController由于内存压力而终止,objective-c,ios7,uiimagepickercontroller,Objective C,Ios7,Uiimagepickercontroller,我有一个UIViewController,它具有: @property UIImagePickerController* mainPicker; 通过一个按钮,我展示了主选择器,如: - (IBAction)takePhoto:(UIButton *)sender { // Take a photo. if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])

我有一个UIViewController,它具有:

@property UIImagePickerController* 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.
此外,每当显示该视图控制器时,至少会出现两个内存警告

我拍了一张照片后,情况变得更糟了。这简直就是垃圾邮件“收到内存警告”

这是一个仪器截图,希望对你有所帮助

开始时内存大约为4MB。拍完照片后,它的存储空间会增加到10MB。在解聘时,我正在保存UIImage,因此解聘后它的容量接近30MB。 (该内存峰值可能是由writeToFile.引起的。此外,该漏洞只有大约600字节)

目前,我正在测试iPhone5S和iOS7

我尝试过启用僵尸、在一段时间后分派选取器、允许/禁止编辑等等。这些都不起作用。此外,我不会在加载视图控制器后立即显示选择器视图

另外请注意,我已经使用了答案中的函数,下面是日志

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


当仪器在讲述另一个故事时,在设备中看到32 MB的可用内存不是有点奇怪吗?

这里有一些解释可以帮助您解决问题

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

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

第三,修复泄漏可能不足以修复内存警告问题。这些警告表示您使用的内存太多,不符合iOS的喜好。考虑到你的泄漏仅占600字节,问题似乎是你被丢弃的内存。废弃内存是指您已经分配的内存,尽管应用程序可能不再使用它们,但您仍然有活动引用

为了帮助您解决问题,这里有一些相关文档,可以使用工具修复内存泄漏和废弃内存:

此外,这里还有一篇关于废弃内存的有用博客:

显示内存泄漏的代码。