发布IOSurface

Hri*_*shi 7 iphone-privateapi ios4 ios ios5 ios6

这个问题是对以下内容的扩展:
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);
Run Code Online (Sandbox Code Playgroud)
  1. 对CFRelease的调用发生并且app崩溃.没有保存图像.但是,如果您在发布前1-2秒进入睡眠状态,则可以正常工作.
  2. 如果你跳过对UIImageWriteToSavePhotosAlbum()的调用,一切正常,捕获不会中断.
    我仍然不清楚究竟是什么问题以及如何解决它.任何帮助都非常感谢.