【问题标题】:UIImagePickerController memory leak on iOS5iOS5上的UIImagePickerController内存泄漏
【发布时间】:2012-05-29 21:38:39
【问题描述】:

我在 iOS5 和 XCode4.2 上开发的应用程序中使用 UIImagePickerController,出现内存泄漏,我不知道为什么会出现这种泄漏,请您给我答案。

和我的代码:

-(void)createImagePicker 
{
_picker = [[UIImagePickerController alloc] init];
_picker.sourceType = UIImagePickerControllerSourceTypeCamera;

_picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;

_picker.allowsEditing = YES;
_picker.showsCameraControls = NO;


_picker.cameraDevice = UIImagePickerControllerCameraDeviceRear; 

_picker.delegate = self;
_picker.wantsFullScreenLayout = YES;

}

和 viewWillApper 方法:

    -(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeCameraButton:) name:@"ShowMainView" object:nil];
    [self createImagePicker];
    [m_cameraOverlayView setBackgroundColor:[UIColor clearColor]];
    [self presentModalViewController:_picker animated:NO];
    _picker.cameraOverlayView = m_cameraOverlayView;

    [cameraImgView setHidden:YES];
    [filterView setHidden:YES];
    m_cameraOverlayView.hidden = NO;
    cameraSelectedButton.hidden = NO;
    cancelButton.hidden = YES;
    selectButton.hidden = YES;

    for (id Object in [scrollview subviews])
    {
        if([Object isKindOfClass:[UIButton class]])
        {
            [Object removeFromSuperview];
        }
    }

    [m_toolbarImage setFrame:CGRectMake(0, 427, 320, 55)];
    [cameraSelectedButton setFrame:CGRectMake(128, 432, 86, 44)];

    [m_cancelButton setFrame:CGRectMake(10, 434, 82, 40)];
    [m_cancelButton setTitle:@"Close" forState:UIControlStateNormal];
    [m_cancelButton setBackgroundImage:[UIImage imageNamed:@"menu-bar-button.png"] forState:UIControlStateNormal];
    [m_cancelButton setTitleColor:[UIColor colorWithRed:110/256.0 green:52/256.0 blue:28/256.0 alpha:1.0] forState:UIControlStateNormal];


    [cancelButton setFrame:CGRectMake(120, 434, 35, 35)];
    [selectButton setFrame:CGRectMake(184, 434, 35, 35)];

    }

【问题讨论】:

  • 如果您实际发布有问题的方法,而不是屏幕抓取,它可能会有所帮助!特别是您的createImagePicker 方法...
  • 我假设你在某个时候打电话给[_picker release]?
  • 不...我在 xcode 4.2 中实现了这个,所以我没有调用 relese 方法
  • 如果是 ARC,你是弱链接还是强链接?
  • @lxt 能否请您简要告诉我

标签: objective-c xcode ios5 uiimagepickercontroller


【解决方案1】:

您是否在模拟器上运行该应用程序?如果是这样,这是一个历史悠久的问题(或可能会再次出现):

泄漏大部分(但不完全)在模拟器上,而不是 出现在设备上。

http://blog.airsource.co.uk/index.php/2008/11/12/memory-usage-in-uiimagepickercontroller/

【讨论】:

    【解决方案2】:

    这似乎是 iOS 5 中 UIImagePickerController 的问题,无论是否使用 ARC。

    我有一个使用 xcode 3.2.5 为 iOS 4 开发的应用程序,当从库中拍摄或选择照片(在运行 iOS 4.1 的设备上测试)时,Instruments 显示没有泄漏。如前所述,在运行 iOS 5.1 的设备上测试的相同代码泄漏。

    我知道这不是答案,但问题似乎比原始问题更广泛。

    【讨论】:

    • UIImagePickerController 中的内存泄漏似乎发生在滚动选择照片时。如果您选择不滚动的照片,则不会发生泄漏。但是,如果您滚动照片(假设您有足够的照片可以滚动),即使您不选择照片也会发生泄漏,这排除了我的代码问题。
    【解决方案3】:

    我阅读了许多关于该问题的其他帖子。有人说这是 Apple 的问题,这就是 Zillian 建议 PhotoPicker 示例也泄漏的原因。解决方法是只创建一个 UIImagePickerController 实例,可能作为一个单例,并且永远不要释放它(或者让 ARC 为你释放它)。这样,您将始终使用相同的实例,并且它可能会泄漏更少的次数。

    【讨论】:

    • 我试过这个,但也没有用。它仍然会以完全相同的方式泄漏。有些人在my question 上提出了一些其他建议,但似乎没有一个对我有用。我想解决这个问题,但到目前为止我没有任何运气这样做。
    • 我没有说泄漏会消失,只是尽量减少泄漏。在您的应用中发生泄漏并不是什么大问题。
    【解决方案4】:

    刚刚看到,即使是来自 Apple 的源代码链接 here 也存在与我们相同的问题...

    【讨论】:

      【解决方案5】:

      您应该调用 [_picker release]; 以放弃 _picker 内存的所有权,如 Apple 内存管理文档中所述。

      【讨论】:

      • 问题在于 ARC 已开启。因此无法调用release
      • @edo42 是的,因为 tikkes 说这是在 iOS5 中,所以我不能调用 release
      • 他没有指明 ARC 是开启的
      猜你喜欢
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2018-07-08
      • 1970-01-01
      • 2011-10-27
      • 2012-12-23
      相关资源
      最近更新 更多