UIImagePickerController:[PLImageScrollView release]:发送给deallocated实例的消息

时间:2012-10-01 17:14:33

标签: ios cocos2d-iphone automatic-ref-counting uiimagepickercontroller ios6

我正在使用Cocos2D编写一个iOS6应用程序,并打开ARC(Cocos链接为静态库,而不是ARC)。我可以使用以下代码展示相机:

cameraController = [[UIImagePickerController alloc] init];
// set other properties of camera
cameraController.delegate = psImageLayer;
psImageLayer.imagePicker = cameraController;
[[CCDirector sharedDirector] presentViewController:cameraController animated:YES completion:nil];

我使用以下代码关闭psImageLayer中的相机:

- (void) imagePickerController: (UIImagePickerController *) picker
didFinishPickingMediaWithInfo: (NSDictionary *) info {
    // do something with image
    [[CCDirector sharedDirector] dismissViewControllerAnimated:YES completion:nil];
}

当我关闭相机时,应用程序崩溃时出现以下错误:*** -[PLImageScrollView release]: message sent to deallocated instance 0x2494f4f0我很确定PLImageScrollView是iOS类,因为我没有写它。

我的问题似乎与发布here的问题非常相似,但他的解决方案涉及修改拥有该委托的类。在这种情况下,UIImagePickerController是类,无法修改。

PhotoShareImageLayer头文件的相关部分发布在下面:

// PhotoShareImageLayer.h (this is what psImageLayer is)
@interface PhotoShareImageLayer : CCLayer <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@property(nonatomic, retain) UIImagePickerController *imagePicker;
@property(nonatomic, retain) UIImage *currentImage;

@end

有关如何阻止此错误发生的任何想法?感谢。

编辑:我已经尝试过的事情清单。

  • 对UIImagePickerController进行子类化并添加- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self setDelegate:nil]; }

编辑2:imagePickerController:didCancel中没有发生崩溃。仅在拍摄照片时,或者在相机中按下“重拍”时。 “重拍”没有UIImagePickerDelegate方法(只有“取消”和“使用”)。

编辑3:在继续并编写更多应用程序后,看起来此问题并非相机所独有。解雇Twitter,Facebook,联系人等的模态视图时会出现相同(或非常相似)的错误。

1 个答案:

答案 0 :(得分:0)

我认为这是Apple在PLImageScrollView内部实施的问题。我正在调整UIScrollView的setDelegate方法,这会在使用UIImagePicker时导致崩溃(尽管如果您选择照片似乎只是取消,而不是取消)。我最终看到的问题是scrollViewDidScroll:方法被发送到真正的委托(通过我的拦截器),但它已经被释放了。

这告诉我,PLImageScrollView的委托正在被解除分配而没有被解雇。我通过创建自己的strong对真实委托的引用来解决问题。这可能会导致其他实现中的内存泄漏,但这比崩溃更好。