簡體   English   中英

使用CGImageCreateWithJPEGDataProvider時發生內存泄漏

[英]memory leak when using CGImageCreateWithJPEGDataProvider

我使用Instruments(Leaks)來檢測我的應用程序的內存泄漏。 有時它說我的一種方法存在內存泄漏。 我不確定是否有泄漏以及如何解決。

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中的內存泄漏,如下所示

屏幕截圖1

提及如下所示的內存泄漏將有助於進一步解決您的問題

屏幕截圖2

您應該釋放為緩沖區分配的內存。

free(buffer);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM