iOS5上UIImagePickerController内存泄漏问题

5
我在我的iOS5和XCode4.2应用程序中使用UIImagePickerController,发现了内存泄漏,但我不知道为什么会出现这种泄漏,请问您能否为我解答此问题。
以下是我附加的截图: here i am attaching my screen shot: 还有我的代码:
-(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;

}

和viewWillAppear方法:

    -(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方法... - lxt
我假设你在某个时候调用了 [_picker release] - lxt
我在Xcode 4.2中实现了这个,所以我没有调用release方法。 - Steve Gear
如果是ARC,你是弱引用还是强引用链接? - lxt
你应该在 viewWillDisappear:(BOOL)animated 方法中移除观察者。使用以下代码:[[NSNotificationCenter defaultCenter] removeObserver:self name:@"ShowMainView" object:nil]; - Aleksander Azizi
显示剩余3条评论
5个回答

4
这似乎是在iOS 5中使用UIImagePickerController时出现的问题,无论是否使用ARC。我有一个为iOS 4开发的应用程序,使用xcode 3.2.5,当从库中选择或拍摄照片时,Instruments没有泄漏(在运行iOS 4.1的设备上测试)。但是,在运行iOS 5.1的设备上测试相同的代码会出现泄漏问题。虽然这不是一个答案,但这个问题似乎比原来的问题更广泛。

UIImagePickerController中的内存泄漏似乎会在滚动选择照片时发生。如果你选择一张照片而不滚动,就不会发生泄漏。但如果你滚动照片(假设你有足够的照片可以滚动),即使你不选择照片,泄漏也会发生,这排除了问题是我的代码的可能性。 - Greg Young

3

刚刚发现,甚至苹果的源代码链接这里也存在我们遇到的同样问题...


2
您需要调用[_picker release];来释放_picker内存的所有权,如苹果内存管理文档中所述。

问题是开启了ARC。因此无法调用“release”。 - Tikkes
@edo42 是的,就像tikkes说的一样,这是在iOS5中,所以我不能调用release。 - Steve Gear
他没有指定ARC是开启的。 - albianto

1

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


我尝试过这个,但那个也没有起作用。它仍然会以完全相同的方式泄漏。有些人在我的问题上建议了一些其他的东西,但是它们似乎都对我没用。我想修复这个问题,但到目前为止我还没有成功。 - Tikkes
我并没有说漏洞会消失,只是试图减少它。在应用程序中有一个漏洞并不是一个大问题。 - albianto

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接