7

这个问题是对以下内容的扩展:
Link-1:从 ios 表面创建图像并将其保存
Link-2:从 iOS 应用程序截屏 - 模拟显示记录器(内部查询)

(请参阅 Link-1)我有在后台工作的截图代码。但如前所述,它需要 2 秒的睡眠才能不间断地工作,否则操作系统会暂停应用程序。我发现原因可能是我没有明确发布我创建的 IOSurface。
原因 - 使用 Victor Ronin 提供的链接http://pastie.org/pastes/3734430,即使没有睡眠,捕获也能正常工作。每次写入图像后,我都尝试使用 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

我认为你需要释放表面。它是由 API IOSurfaceCreate 创建的,它不是由 autorelease 管理的。

例如,我发现以下代码已发布:

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 回答