内存泄漏UIIMageFromCVMat

时间:2014-02-05 20:29:13

标签: ios opencv

我正在尝试将CVMat转换为UIImage,但是我遇到了内存泄漏,并且无法在我的生活中找出答案。问题在于。我使用的是openCV在其示例代码Located Here中使用的相同功能。

代码说明如下:

+(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; 
}

有人对问题的位置有任何建议吗? (我们已经缩小并确定这是泄漏的地方)。

修改

提供我发现的更多信息:如果从未使用过该函数的输出,则没有问题。只有当我们将此结果分配给不同类中的变量时,我们才会遇到问题。

2 个答案:

答案 0 :(得分:4)

好的,经过多次搜索后,我们发现了解决方案(虽然我对此问题仍然没有非常深刻的理解,如果有人能够指出我为什么会出现这个问题的正确方向,那就是太好了)。

所有需要做的就是在@autoreleasepool{}标记中包含使用此结果的代码行。

我从this question

找到了解决方案的基本概念

答案 1 :(得分:0)

假设您没有使用ARC,我的猜测是有问题的陈述是 CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
__bridge不转让所有权,因此CGDataProviderRelease(provider);不会释放原始对象 您要么明确发布data,要么使用__bridge_transfer将所有权转移到provider,然后随CGDataProviderRelease(provider);

发布