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

时间:2014-03-26 20:39:01

标签: ios memory-leaks camera automatic-ref-counting calayer

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

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

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

CALayer Retain Cycle

  1. 我可以对保留周期做些什么。它不在我的代码中,但我仍然是它的原因吗?它是否源于“根漏”?如果我不负责,我该怎么办呢?
  2. Root Leak

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

      编辑 - 我创建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];
      }
      

1 个答案:

答案 0 :(得分:7)

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

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

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

我使用Leaks仪器在Instruments下运行我的代码,然后猜猜是什么?我看到你遇到了同样的问题。

enter image description here

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

UIImagePickerController memory leak on iOS5

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