UIIMageFromCVMat memory leak

I am trying to convert CVMat to UIImage, but I am running into a memory leak and cannot let my life determine where. the problem lies. I use the same function that openCV uses in its code example, "Located here."

The code says the following:

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

Does anyone have any suggestions on where the problem might be? (We have narrowed and we know for sure that this place is leaking).

Edit

To provide additional information I found: If the function output is never used, there is no problem. Only if we assign this result to a variable in another class in which we run into problems.

+4
source share
2 answers

, ( , - , , ).

, , , @autoreleasepool{}.

+4

, ARC, , - CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
__bridge , CGDataProviderRelease(provider); .
data , __bridge_transfer provider, CGDataProviderRelease(provider);

0

Source: https://habr.com/ru/post/1525498/


All Articles