7

この質問は次への拡張です:
リンク 1: iOSサーフェスから画像を作成して保存する
リンク 2: iOS アプリからスクリーンショットを撮る - ディスプレイ レコーダーをエミュレートする (内部のクエリ)

(リンク 1 を参照) バックグラウンドでスクリーンショットを撮るためのコードが動作しています。ただし、前述のように、中断なく動作するには 2 秒のスリープが必要です。それ以外の場合、OS はアプリを中断します。その理由は、作成した IOSurface を明示的にリリースしていないことが原因である可能性があることがわかりました。
理由 - リンクhttp://pastie.org/pastes/3734430を使用すると、Victor Ronin によって提供され、キャプチャはスリープなしでも正常に機能します。毎回画像を書き込んだ後にCFReleaseを使ってdestSurf(作成したデスティネーションサーフェス)を解放してみましたがうまくいきません。

いつ、どのように、作成された IOSurface をリリースするかどうかについてのヘルプは、非常に役立ちます。ありがとう。

更新
だから、これがまさに起こることです。(Link-1参照)

IOSurfaceRef destSurf = IOSurfaceCreate(dict);
IOSurfaceAcceleratorRef outAcc;
IOSurfaceAcceleratorCreate(NULL, 0, &outAcc);

CFDictionaryRef ed = (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: nil];
IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, ed, NULL);

IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed);

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, IOSurfaceGetBaseAddress(destSurf), (width*height*4), NULL);
CGImageRef cgImage=CGImageCreate(width, height, 8, 8*4, IOSurfaceGetBytesPerRow(destSurf), CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, provider, NULL, YES, kCGRenderingIntentDefault);
UIImage *image = [UIImage imageWithCGImage: cgImage];
CGImageRelease(cgImage);
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
CFRelease(destSurf);
  1. CFRelease の呼び出しが行われ、アプリがクラッシュします。保存された画像はありません。ただし、リリース前に 1 ~ 2 秒のスリープを入れると、問題なく動作します。
  2. UIImageWriteToSavePhotosAlbum() への呼び出しをスキップすると、すべてが正常に機能し、キャプチャは中断することなく行われます。
    問題の正確な内容とその解決方法についてはまだ明確ではありません。どんな助けでも大歓迎です。
4

1 に答える 1

3

表面を解放する必要があると思います。これは、autorelease によって管理されていない API IOSurfaceCreate によって作成されます。

例として、リリースされている次のコードを見つけました。

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=8&cad=rja&ved=0CF0QFjAH&url=http%3A%2F%2Fcode.google.com%2Fp%2Fsyphon-framework%2Fsource% 2Fbrowse%2Ftags%2Fpublic-beta-1%2FSyphonServer.m%3Fr%3D3&ei=i_zRUMWQDMqw0AHs7IHYDA&usg=AFQjCNG9yO3sUf-ZQy-W_h_Q9WJMm4hqgw

http://www.opensource.apple.com/source/WebCore/WebCore-7536.24/platform/graphics/surfaces/mac/GraphicsSurfaceMac.cpp?txt

CFRelease でリリースしようとするとどうなりますか? クラッシュしますか、それとも同じ 2 秒の問題がありますか?

于 2012-12-19T17:52:32.513 に答える