内存泄漏时使用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; } } 

我在dealloc中释放mBitmap。

提前致谢。

您可以使用分析器分析Xcode中的内存泄漏,如下所示

Screenshot1

提到如下所示的内存泄漏将有助于进一步解决您的问题

Screenshot2

您应该释放为缓冲区分配的内存。

 free(buffer);