この質問は次への拡張です:
リンク 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);
- CFRelease の呼び出しが行われ、アプリがクラッシュします。保存された画像はありません。ただし、リリース前に 1 ~ 2 秒のスリープを入れると、問題なく動作します。
- UIImageWriteToSavePhotosAlbum() への呼び出しをスキップすると、すべてが正常に機能し、キャプチャは中断することなく行われます。
問題の正確な内容とその解決方法についてはまだ明確ではありません。どんな助けでも大歓迎です。