UIIMageFromCVMat 造成的内存泄漏,这个问题如果做openCV的同学可能已经遇到了,网上的解决方法很统一,相信寻找过的
同学都尝试过用@autoreleasepool{}或者CFRelease((__bridge CFDataRef) data) 的方式尝试解决过,反正我也都没成功,也有很多人
都不成功,但是都没有最终解决方案,我来分享下我的解决方法(我的openCV库是3.3)来总结下问题的原因:
首先,目前IOS工程几乎都是ARC项目,所以几乎不存在GCD中手动释放data的问题,所以上面的CFRelease((__bridge CFDataRef) data)
方法是没有意义的,而且加上程序会崩溃(因为data)已经被释放过了,我想这个解决方法应该是针对老的openCV库 (没有对
CFDataRef用__bridge修饰),目前新的openCV lib是ok的,参考:https://docs.opencv.org/2.4/doc/tutorials/ios/image_manipulation/image_manipulation.html#opencviosimagemanipulation
@autoreleasepool方法也不是官方推荐的方法,只是一个网友(仅仅就是一个人)自己的解决方法,其他人还是苦苦的
盯着UIImageFromCVMat方法,想从中找到内存泄漏的地方,可能这个问题太冷门了,我当时也是抱着死马当活马医的态度,上来
就尝试了,最后还是失败的。
最后,我重新将问题扩大到应用openCV功能的上下文项目环境,发现了一个诡异情况,就是我原来做的openCVDemo 是没有
内存泄漏的,也是频繁使用了这个接口,但是内存很稳定,我做的自动裁剪功能集成到项目中的时候,内存就有增无减。
那我大胆的猜想:UIImageFromCVMat其实本身没有内存泄漏,或者只是项目在使用到这个接口的时候,调用的上下文环境造成了它
内存的未释放?最后找到了问题的原因,是我再获取相机图片准备使用openCV处理之前,将这个图片裁剪了一下,但是有个CGImageRef
没有手动释放造成的。
如果有同样遇到这种问题的小伙伴,看看是不是引用这个方法的上下文有问题,或者有对这部分内存管理研究透彻的伙伴
从根本上提一些实质上的建议是最好的。
最后说一句:csdn破编辑器越来越难用 排个版真难