2

ディスクから UIImage に画像を読み込んでおり、その CGImage をメディア処理用の別のワーカー キュー ブロックで使用しています。

メイン キューで CGImageRef を定義し、ワーカー キューで CGImageRef を使用すると、EXC_BAD_ACCESS が発生します。このような:

UIImage *uiimage = [UIImage imageWithContentsOfFile:[aPhoto completeLargeThumbFilePath]];

CGImageRef cgImage = uiimage.CGImage;

dispatch_queue_t    dispatchQueue = dispatch_queue_create("mediaInputQueue", NULL);
[writerInput requestMediaDataWhenReadyOnQueue:dispatchQueue usingBlock:^{

    // ... unrelated stuff
    CVPixelBufferRef buffer = (CVPixelBufferRef)[self pixelBufferFromCGImage:cgImage size:size];
    // ... unrelated stuff
}];

ワーカー キューで uiimage.CGImage を直接使用すると、例外は発生しません。これはARCメモリ管理に関連していると思います。UIImage は Objective-C オブジェクトで、CGImageRef は C 構造体へのポインタです。UIImage は、最初のケースで CGImage を使用する前に解放されます。

私の質問は、メイン キューで定義された C ポインターを別のディスパッチ キューで直接使用するにはどうすればよいですか?

4

2 に答える 2

2

uiimage自動リリースされます。したがって、最も可能性が高いのcgImageは、 が自動解放されるときに割り当てが解除されることUIImageです。

を保持してcgImageから、ブロックで解放してみてください。または、ブロック内で を使用することもできますuiimage(ブロックの最後に追加[uiimage self];します -- 間抜けに見えますが、機能します)。

根底にある問題は、内部ポインター問題と呼ばれるものです。オブジェクト内の何かへのポインターを取得していますが、オブジェクトへの強い参照を維持していません。オブジェクトがなくなると、内部ポインターが指すものはすべて取得され、ダングリング ポインターが残ります。

私はこれで行きます:

UIImage *uiimage = [UIImage imageWithContentsOfFile:[aPhoto completeLargeThumbFilePath]];

dispatch_queue_t    dispatchQueue = dispatch_queue_create("mediaInputQueue", NULL);
[writerInput requestMediaDataWhenReadyOnQueue:dispatchQueue usingBlock:^{
    CGImageRef cgImage = uiimage.CGImage;

    // ... unrelated stuff
    CVPixelBufferRef buffer = (CVPixelBufferRef)[self pixelBufferFromCGImage:cgImage size:size];
    // ... unrelated stuff
}];
于 2013-07-23T17:13:21.330 に答える