memory leak when using CGImageCreateWithJPEGDataProvider

I use Instruments(Leaks) to detect memory leaks of my app. It sometimes says there is a memory leak in one of my methods. I am not sure whether there is a leak and how to solve it.

CGImageCreateWithJPEGDataProvider method cause the memory leak mainly. Sometimes CGDataProviderCreateWithData also cause memory leak. But i don’t know why.

  • Difference between vs init]
  • Memory leaks when playing a video iPhone
  • ADMOB Memory Leaking?
  • Potential leak of object stored in context
  • Iphone SDK Utility Application template has leak
  • Many leaks showing in Instruments caused by Array and Dictionary
  • The leak method in Class A is as follows:

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

    Also some other related methods:

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

    And I release mBitmap in the dealloc.

    Thanks in advance.

    2 Solutions Collect From Internet About “memory leak when using CGImageCreateWithJPEGDataProvider”

    You can analyze the Memory Leaks in the Xcode using the analyzer as shown below

    Screenshot1

    Mentioning the memory leaks shown as below would help in further solving your problem

    Screenshot2

    You should free the memory you allocated for your buffer.

    free(buffer);