这个问题是对以下内容的延伸:
Link-1:Creating an image out of the ios surface and saving it
Link-2:Taking Screenshots from iOS app - emulating Display recorder (query on the internals)
(参考链接-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);
答案 0 :(得分:3)
我认为你需要释放表面。它由API IOSurfaceCreate创建,它不由autorelease's管理。
作为示例,我发现以下代码已发布:
如果您尝试使用CFRelease释放它会发生什么?它会崩溃还是有相同的2秒问题?