1

Instruments(Leaks) を使用して、アプリのメモリ リークを検出します。私のメソッドの1つにメモリリークがあると時々言われます。リークがあるかどうか、およびそれを解決する方法がわかりません。

主に 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 を解放します。

前もって感謝します。

4

2 に答える 2

1

以下に示すように、アナライザーを使用して Xcode のメモリ リークを分析できます。

スクリーンショット1

以下に示すメモリリークについて言及すると、問題をさらに解決するのに役立ちます

スクリーンショット2

于 2012-08-31T08:53:35.097 に答える
0

バッファに割り当てたメモリを解放する必要があります。

free(buffer);
于 2012-08-31T09:02:14.533 に答える