0

ARCをオンにしてCocos2Dを使用して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];
}

カメラを閉じると、アプリが次のエラーでクラッシュします。私はそれを作成しなかったので、それはiOSクラスであると*** -[PLImageScrollView release]: message sent to deallocated instance 0x2494f4f0確信しています。PLImageScrollView

私の問題はここに投稿された問題と非常に似ているようですが、彼の解決策には、デリゲートを所有するクラスを変更することが含まれます。この場合、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、連絡先などのモーダルビューを閉じるときに、同じ(または非常に類似した)エラーが発生します。

4

1 に答える 1

0

これは、Apple の内部実装に問題があると思いますPLImageScrollView。UIScrollView の setDelegate メソッドをスウィズリングしていますが、UIImagePicker を使用するとクラッシュします (ただし、キャンセルした場合ではなく、写真を選択した場合のみのようです)。私が最終的に目にする問題は、scrollViewDidScroll: メソッドが (インターセプターを介して) 実際のデリゲートに送信されることですが、既にリリースされています。

これは、PLImageScrollView のデリゲートが解放されずに解放されていることを示唆しています。strong実際のデリゲートへの独自の参照を作成することで、問題を半分解決しました。これにより、他の実装でメモリ リークが発生する可能性がありますが、少なくともクラッシュよりはましです。

于 2014-11-20T17:49:06.367 に答える