iOS中内存管理的坑

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];

cicontextError
原因:项目使用MRC,需要手动管理部分对象内存,由于OC中一般对象初始化后系统内部会自行retain,如NSString,UIImage... 它们只需要完成自己对应初始化方法,但是CIContext初始化方法中并未实现将CIContext对象retain,所以使用出错。
解决方案:初始化完成后手动retain.[ciContext retain]; 一般来说只要碰到如上图的情况在MRC项目中较多,往往是内存管理出了问题,因为众多OC对象无法一一记牢,但可以记住解决问题的模式。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 11,008评论 8 119
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 6,052评论 1 16
  • 内存管理的基本范围和概念. 程序运行过程中药创建大量的对象, 和其他高级语言类似,在ObjC中对象存储在堆区,程序...
    ValienZh阅读 4,386评论 0 2
  • 内存管理 ARC处理原理 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做...
    b485c88ab697阅读 13,827评论 3 47
  • 野旷别友 雨晴风淡疏云翳,山远雾隐没雁迹。 棠梨叶落萧萧色,木槿花开盈盈惜。 牧儿悠悠送晚景,短笛声声催别离。 ...
    南窗居士阅读 1,891评论 0 2