因此,我最近将iOS更新为9.0.2。我一直在使用RosyWriter,苹果的例子,用CIFilter和CIContext捕捉和过滤视频帧。它在iOS 7和8中非常有效,在iOS 9中都出现了故障。
现在,RosyWriter和我的应用程序中的内存报告如下:

最终,应用程序崩溃了。
我将_ciContext呈现: toCVPixelBuffer:界: colorSpace:;和_ciContext当我调用这两种方法时,CIContext似乎有内部内存泄漏。
在花了大约4天之后,我发现如果我每次创建一个新的CIContext实例,我希望呈现一个缓冲区并在之后释放它--这会使内存减少。但这不是一个解决方案,因为这样做太昂贵了。
还有人有这个问题吗?有办法绕道吗?
谢谢。
发布于 2015-12-26 11:02:19
我可以确认这个内存泄漏仍然存在于iOS 9.2上。(我也在苹果开发者论坛上发布过。)
我在iOS 9.2上也有相同的内存泄漏。我已经测试过通过使用EAGLContext和MLKDevice删除MetalKit。我已经使用了不同的CIContext方法进行了测试,比如drawImage、createCGImage和render,但是似乎没有什么效果。
很明显,从iOS 9开始,这是一个bug。从苹果下载示例应用程序(见下文),然后在带有iOS 8.4的设备上运行相同的项目,然后在iOS 9.2的设备上运行相同的项目,并注意Xcode中的内存规。
将其添加到APLEAGLView.h:20中
@property (strong, nonatomic) CIContext* ciContext;将APLEAGLView.m:118替换为
[EAGLContext setCurrentContext:_context];
_ciContext = [CIContext contextWithEAGLContext:_context];最后将APLEAGLView.m:341-343替换为
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
@autoreleasepool
{
CIImage* sourceImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIFilter* filter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:kCIInputImageKey, sourceImage, nil];
CIImage* filteredImage = filter.outputImage;
[_ciContext render:filteredImage toCVPixelBuffer:pixelBuffer];
}
glBindRenderbuffer(GL_RENDERBUFFER, _colorBufferHandle); 发布于 2016-03-04 07:35:04
只需在使用上下文之后使用下面的代码
context = [CIContext contextWithOptions:nil];以及发布CGImageRef对象
CGImageRelease(<CGImageRef IMAGE OBJECT>);发布于 2015-12-15 06:03:14
克拉夫特
你在写自定义过滤器吗?我发现在iOS 9中,dod的工作方式不同。
看起来,如果dod.extent.initi.x和dod.extent.initi.y不接近以双倍形式存储的整数(例如,31.0,333.0),那么输出映像的extent.size将为(dod.extent.size.width + 1.0,dod.extent.size.height + 1.0)。在iOS 9.0之前,输出映像的extent.size总是(dod.extent.size)。因此,如果(您一次又一次地通过自定义的CIFilter &您的dod.extent不接近很好的,甚至是整数){当过滤器运行时其尺寸增加了1.0的图像,这可能会产生像您一样的内存配置文件。
我假设这是iOS 9中的一个bug,因为输出图像的大小应该总是与dod的大小相匹配。
我的设置: iOS v9.2,iPhone 5C和iPad 2,Xcode 7.2,Obj-C
https://stackoverflow.com/questions/32981663
复制相似问题