Утечка памяти при использовании CGImageCreateWithJPEGDataProvider
Я использую инструменты (утечки), чтобы обнаружить утечки памяти моего приложения. Иногда говорится, что в одном из моих методов есть утечка памяти. Я не уверен, есть ли утечка и как ее решить.
Метод CGImageCreateWithJPEGDataProvider в основном вызывает утечку памяти. Иногда CGDataProviderCreateWithData также вызывает утечку памяти. Но я не знаю почему.
Метод утечки в классе A является следующим:
- (ResultHolder *)decodeData:(UInt8 *) data withOffset:(int) offset {
const int length = [IOUtilities byteArrayToIntWithData:data Offset:offset+18];
UInt8 *buffer = malloc(length*sizeof(UInt8));
memcpy(buffer, data+offset+22, length);
// sometimes memory leak in this line
CGDataProviderRef jpgDataProvider = CGDataProviderCreateWithData(NULL, buffer, length, freeData);
// mainly memory leak in this line.
CGImageRef image = CGImageCreateWithJPEGDataProvider(jpgDataProvider, NULL, true, kCGRenderingIntentSaturation);
CGDataProviderRelease(jpgDataProvider);
ResultHolder *result = [[ResultHolder alloc] initWithCGImage:image];//sometimes memory leaks in this line.
CGImageRelease(image);
return result;
}
Также некоторые другие связанные методы:
// class A free buffer callback.
void freeData(void *info, const void *data, size_t size) {
free((void *)data);
}
// class ReslutHolder init and dealloc.
- (id)initWithCGImage:(CGImageRef)image {
if (self = [super init]) {
CGImageRetain(image);
//sometimes memory leak in this line.
mBitmap = CGImageCreateCopy(image);
mWidth = CGImageGetWidth(image);
mHeight = CGImageGetHeight(image);
CGImageRelease(image);
}
return self;
}
- (void)dealloc {
if (mBitmap != NULL) {
CGImageRelease(mBitmap);
mBitmap = NULL;
}
}
И я выпускаю mBitmap в Deloc.
Заранее спасибо.
2 ответа
Решение
Вы можете проанализировать утечки памяти в Xcode, используя анализатор, как показано ниже
Упоминание утечек памяти, показанных ниже, поможет в дальнейшем решении вашей проблемы.
Вы должны освободить память, выделенную для вашего буфера.
free(buffer);