使用CGImageCreateWithJPEGDataProvider当内存泄漏(memory le

2019-06-27 14:47发布

我用仪器(泄漏)来检测我的应用程序的内存泄漏。 有时候说,有在我的方法中的一种内存泄漏。 我不知道是否有泄漏,以及如何解决它。

CGImageCreateWithJPEGDataProvider方法使存储器泄漏为主。 有时CGDataProviderCreateWithData也导致内存泄漏。 但我不知道为什么。

在一类的泄漏的方法如下:

- (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中的dealloc。

提前致谢。

Answer 1:

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

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



Answer 2:

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

free(buffer);


文章来源: memory leak when using CGImageCreateWithJPEGDataProvider