发布IOSurface

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

(参考链接-1)我有在后台工作时截取屏幕截图的代码。 但如上所述,它需要2秒的睡眠才能不间断地工作,否则操作系统会暂停应用程序。 我想出原因可能是我没有明确发布我创建的IOSurface。
原因 – 使用Victor Ronin提供的链接http://pastie.org/pastes/3734430 ,即使没有睡眠,捕获也能正常工作。 在我每次写入图像后,我尝试使用CFRelease释放destSurf(我创建的目标表面),但这不起作用。

任何有关何时,如何以及是否发布创建的IOSurface的帮助都将非常有用。 谢谢。

更新
所以,这就是确切发生的事情。 (参考链接-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()的调用,一切正常,捕获不会中断。
    我仍然不清楚究竟是什么问题以及如何解决它。 任何帮助都非常感谢。

我想你需要释放表面。 它由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-β-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秒问题?