Я пытаюсь преобразовать CVMat в UIImage, но я сталкиваюсь с утечкой памяти и не могу на всю жизнь выяснить, где. проблема кроется. Я использую ту же функцию, что openCV использует в своем примере кода Located Here.Memory Leak UIIMageFromCVMat
Код говорит следующее:
+(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;
}
Кто-нибудь есть какие-либо предложения о том, где проблема может быть? (Мы сузились и знаем наверняка, что это место с утечкой).
Редактировать
Чтобы дать больше информации, что я нашел: Если выход функции никогда не используется, нет никаких проблем. Только если мы присвоим этому результату переменную в другом классе, в которой мы сталкиваемся с проблемами.
Я предполагаю, что вы используете НОД, как мне запустить это в фоновом потоке? Причина требования autoreleasepool приведена в документах Apple [здесь] (https://developer.apple.com/library/ios/DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/ UID/TP40008091-CH102-SW1). В принципе, GCD действительно медленно пуст пул по умолчанию. –
Не помог мне, попытался поставить код в autoreleasepool, но на самом деле ничего не изменилось. – C0mrade
Я пробовал autoreleasepool, но не работает. – GeneCode