case 1 : 使用CIContext作为全局对象。渲染时一直报错。错误代码如下:
if (ciContext == nil) { kCIContextOutputColorSpace : (__bridge id)rgbColorSpace}];
EAGLContext *eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
ciContext = [CIContext contextWithEAGLContext:eaglContext options:@{kCIContextWorkingColorSpace : [NSNull null]}];
}
[ciContext render:ciImage toCVPixelBuffer:pixelBuffer bounds:cropRect colorSpace:nil];
原因:项目使用MRC,需要手动管理部分对象内存,由于OC中一般对象初始化后系统内部会自行retain,如NSString,UIImage... 它们只需要完成自己对应初始化方法,但是CIContext初始化方法中并未实现将CIContext对象retain,所以使用出错。
解决方案:初始化完成后手动retain.[ciContext retain];
一般来说只要碰到如上图的情况在MRC项目中较多,往往是内存管理出了问题,因为众多OC对象无法一一记牢,但可以记住解决问题的模式。