使用Instruments跟踪内存泄漏Xcode5和iOS7

kna*_*f74 4 camera memory-leaks calayer ios automatic-ref-counting

我开发了我的第一个应用程序,仍在学习 刚刚更新了Xcode 5,我的iPhone 5正在运行iOS 7.1.我现在正致力于理解"仪器"工具来分析我的应用程序.我正在使用仪器中的泄漏配置文件,并且遇到了一个我无法弄清楚的保留周期和泄漏.感谢我能理解的任何帮助a)如何查明错误和b)我做错了什么以及如何在将来避免它.

在我的应用程序中,我正在使用相机拍摄照片.当相机启动时,我轻触屏幕进行对焦,这时我注意到仪器中出现了泄漏.看起来我的代码中没有保留周期(如果我理解正确)和我的代码中的根漏洞,我不明白.

我正在使用ARC,所以我不应该在我指向我的代码部分中发布"picker"(下面的第2部分,带代码).

CALayer保留周期

  1. 我该如何处理保留周期.它不在我的代码中,但我仍然是它的原因吗?它是否源于"根漏"?如果我不负责,我该怎么办呢?

根泄漏

  1. 我在堆栈跟踪中的唯一代码无法帮助我理解泄漏的来源.该行是仪器指向我的代码是[picker dismissViewControllerAnimated:YES completion:nil]; 在我的imagePickerController中:didFinishPickingMediaWithInfo:方法.我正在粘贴下面的代码.
 - (void)imagePickerController:(UIImagePickerController *)picker
    didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *pickerImage = [info objectForKey:
                            UIImagePickerControllerOriginalImage];

    _imageView.image = pickerImage;

    [picker dismissViewControllerAnimated:YES completion:nil]; // <--- mem-leak
}
Run Code Online (Sandbox Code Playgroud)

编辑 - 我创建我的UIImagePickerController的代码.

- (IBAction)snapPicture:(id)sender
{
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

    // If the camera button was tapped AND we have a camera, use it...
    if ((sender == _cameraButton) && [UIImagePickerController
         isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    } else {
        [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    }

    imagePicker.delegate = self;

    // bring up the image picker view
    [self presentViewController:imagePicker animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)

mat*_*att 7

这是我的理论:你遇到的问题显然是苹果公司自己的代码中的一个错误(或缺陷),而你所能做的只是疯狂地笑而忘记它.

为了测试我的理论,我运行了自己的代码,完全独立地编写并在不同的时间编写.它与您的代码几乎完全相同:它允许用户拍照,并将图像放入界面.这是我的代码:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch17p702takeAPicture/ch30p962takeAPicture/ViewController.m

我使用Leaks仪器在Instruments下运行我的代码,猜猜是什么?我看到你做的同样的问题.

在此输入图像描述

当然,我开始在Stack Overflow上搜索,所有这些都证明是旧的.例如:

iOS5上的UIImagePickerController内存泄漏

甚至Apple自己的示例代码,称为PhotoPicker(或使用UIImagePickerController来选择图片和拍照)也有同样的泄漏.