我正在使用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
有关如何阻止此错误发生的任何想法?感谢。
编辑:我已经尝试过的事情清单。
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self setDelegate:nil];
}
编辑2:imagePickerController:didCancel
中没有发生崩溃。仅在拍摄照片时,或者在相机中按下“重拍”时。 “重拍”没有UIImagePickerDelegate方法(只有“取消”和“使用”)。
编辑3:在继续并编写更多应用程序后,看起来此问题并非相机所独有。解雇Twitter,Facebook,联系人等的模态视图时会出现相同(或非常相似)的错误。
答案 0 :(得分:0)
我认为这是Apple在PLImageScrollView
内部实施的问题。我正在调整UIScrollView的setDelegate方法,这会在使用UIImagePicker时导致崩溃(尽管如果您选择照片似乎只是取消,而不是取消)。我最终看到的问题是scrollViewDidScroll:方法被发送到真正的委托(通过我的拦截器),但它已经被释放了。
这告诉我,PLImageScrollView的委托正在被解除分配而没有被解雇。我通过创建自己的strong
对真实委托的引用来解决问题。这可能会导致其他实现中的内存泄漏,但这比崩溃更好。