fuite de memory lors de l'utilisation CGImageCreateWithJPEGDataProvider

J'utilise Instruments (Leaks) pour détecter les memory leaks de mon application. Il dit parfois qu'il y a une fuite de memory dans l'une de mes methods. Je ne suis pas sûr s'il y a une fuite et comment la résoudre.

La méthode CGImageCreateWithJPEGDataProvider provoque principalement la fuite de memory. Parfois, CGDataProviderCreateWithData provoque également une fuite de memory. Mais je ne sais pas pourquoi.

La méthode de fuite dans la class A est la suivante:

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

Aussi quelques autres methods connexes:

 // 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; } } 

Et je libère mBitmap dans le dealloc.

Merci d'avance.

Vous pouvez parsingr les memory leaks dans le Xcode en utilisant l'parsingur comme indiqué ci-dessous

Screenshot1

Mentionner les memory leaks indiquées ci-dessous aiderait à résoudre votre problème

Screenshot2

Vous devriez libérer la memory que vous avez allouée pour votre tampon.

 free(buffer);