-->

释放的IOSurface(Releasing an IOSurface)

2019-07-05 22:15发布

这个问题是一个扩展到:
链接1: 出IOS表面的创建图像并保存
链路-2: 从iOS应用以截图-模拟显示记录器(在内部查询)

(参见链接-1)我有一个截屏在后台运行的代码。 但作为说明,它需要2秒的睡眠不间断地工作,否则OS暂停的应用程序。 我想通了,其原因可能是因为我没有明确释放IOSurface创建。
原因-使用链接http://pastie.org/pastes/3734430由Victor罗宁给出了捕获正常工作,即使没有睡眠。 我试着用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(),一切工作正常和捕捉不用中断。
    我仍然不上究竟是什么问题,如何解决这个问题清楚了。 任何帮助,高度赞赏。

Answer 1:

我认为你需要释放表面。 这是由不被自动释放的管理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-β-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秒的问题?



文章来源: Releasing an IOSurface