0

我正在编写一个使用 Cocos2D 并打开 ARC 的 iOS6 应用程序(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 类,因为我没有编写它。

我的问题似乎与此处发布的问题非常相似,但他的解决方案涉及修改拥有委托的类。在这种情况下, 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. 仅在拍照时,或在相机中按下“重拍”时。“Retake”没有 UIImagePickerDelegate 方法(只有“Cancel”和“Use”)。

编辑 3:在继续编写更多应用程序后,看来这个问题并不是相机独有的。关闭 Twitter、Facebook、联系人等的模式视图时会发生相同(或非常相似)的错误。

4

1 回答 1

0

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

这向我表明 PLImageScrollView 的委托正在被解除分配而没有被取消。通过创建自己strong对真正代表的引用,我解决了一半的问题。这可能会导致其他实现中的内存泄漏,但这至少比崩溃要好。

于 2014-11-20T17:49:06.367 回答