在使用[UIImage imageWithCVMat:(const cv::Mat&)cvMatt]将Mat数据作为UIImage时会碰到内存无法释放,一直留存问题。使用工具检测(profile)时能定位到确实是这个函数导致内存留存问题。这个问题解决方法是在函数[UIImage imageWithCVMat:(const cv::Mat&)cvMatt]内增加:“CFRelease((__bridgeCFDataRef)data);” 来释放内存。
代码如下:
- (id)initWithCVMat:(const 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((CFDataRef)data);
CGImageRef imageRef = CGImageCreate(cvMat.cols, // Width
cvMat.rows, // Height
8, // Bits per component
8 * cvMat.elemSize(), // Bits per pixel
cvMat.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNone | kCGBitmapByteOrderDefault, // Bitmap info flags
provider, // CGDataProviderRef
NULL, // Decode
false, // Should interpolate
kCGRenderingIntentDefault); // Intent
self = [self initWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
//新增
CFRelease((__bridge CFDataRef)data);
return self;
}
未释放时检测工具检测到的内存留存如图:
释放后,就再也没出现了。
参考文章: