内存泄漏UIIMageFromCVMat

我试图将一个CVMat转换成一个UIImage,但运行到内存泄漏,并不能为我的生活弄清楚在哪里。 问题在于。 我使用openCV在其位于此处的示例代码中使用的相同函数。

该代码说明如下:

+(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat{ NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()]; CGColorSpaceRef colorSpace; if (cvMat.elemSize() == 1) { colorSpace = CGColorSpaceCreateDeviceGray(); } else { colorSpace = CGColorSpaceCreateDeviceRGB(); } CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); bool alpha = cvMat.channels() == 4; CGBitmapInfo bitMapInfo = (alpha ? kCGImageAlphaLast : kCGImageAlphaNone) | kCGBitmapByteOrderDefault; // Creating CGImage from cv::Mat CGImageRef imageRef = CGImageCreate(cvMat.cols, //width cvMat.rows, //height 8, //bits per component 8 * cvMat.elemSize(), //bits per pixel cvMat.step[0], //bytesPerRow colorSpace, //colorspace bitMapInfo, // bitmap info provider, //CGDataProviderRef NULL, //decode false, //should interpolate kCGRenderingIntentDefault //intent ); // Getting UIImage from CGImage UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); CGDataProviderRelease(provider); CGColorSpaceRelease(colorSpace); return finalImage; } 

有没有人对这个问题在哪里有什么build议? (我们已经缩小了,并确定这是泄漏的地方)。

编辑

给我更多的信息,我发现:如果function的输出从来没有使用,没有问题。 只有当我们把这个结果赋给一个不同类的variables时,我们才会遇到问题。

好的,经过多番search,find了解决办法(虽然我对这个问题还没有很深入的了解,如果有人能够指出我为什么是一个问题的正确方向,那就太棒了) 。

所有需要做的事情就是将使用这个结果的代码行包装在@autoreleasepool{}标记中。

我从这个问题中find了解决scheme的基本思路

假设你没有使用ARC,我的猜测是有问题的陈述是
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
__bridge不转让所有权,所以CGDataProviderRelease(provider); 不释放原始对象。
你必须显式地释放data ,或者使用__bridge_transfer将所有权转移给provider ,然后使用CGDataProviderRelease(provider);发布它CGDataProviderRelease(provider);