1

image のメソッドを毎秒複数回呼び出したいのですが、メモリリークがあります。

コードのスクリーンショット

私はやろうとしましCFRelease(rawImageRef);たが、次のエラーを返します:

-[Not A Type retain]: message sent to deallocated instance 0x14dd3770

コードで更新:

- (CGColorRef)averageColorRect:(CGRect)rect {

    CGImageRef rawImageRef = CGImageCreateWithImageInRect(_imageRaster, rect);

    // This function returns the raw pixel values
    CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(rawImageRef));
    const UInt8 *rawPixelData = CFDataGetBytePtr(data);

    NSUInteger imageHeight = CGImageGetHeight(rawImageRef);
    NSUInteger imageWidth  = CGImageGetWidth(rawImageRef);
    NSUInteger bytesPerRow = CGImageGetBytesPerRow(rawImageRef);
    NSUInteger stride = CGImageGetBitsPerPixel(rawImageRef) / 8;

    // Here I sort the R,G,B, values and get the average over the whole image
    unsigned int red   = 0;
    unsigned int green = 0;
    unsigned int blue  = 0;

    for (int row = 0; row < imageHeight; row++) {
        const UInt8 *rowPtr = rawPixelData + bytesPerRow * row;
        for (int column = 0; column < imageWidth; column++) {
            red    += rowPtr[0];
            green  += rowPtr[1];
            blue   += rowPtr[2];
            rowPtr += stride;

        }
    }
    CFRelease(data);

    CGFloat f = 1.0f / (255.0f * imageWidth * imageHeight);
    return [UIColor colorWithRed:f * red  green:f * green blue:f * blue alpha:1].CGColor;

}
4

3 に答える 3

0

解決しました!_imageRaster を追加しました。CG画像と公開後!! ありがとう!

CGImageRef rawImageRef = CGImageCreateWithImageInRect(_imageRaster.CGImage, rect);

// ......

CGImageRelease(rawImageRef);
于 2014-04-30T10:22:21.120 に答える
0

CGImageRelease(rawImageRef)はい、このメソッド内で必要な静的アナライザーは正しいです。

ただし、エラーは、オブジェクトの過剰解放を報告しています。rawImageRef提供されたコード スニペットに基づいて、問題のオブジェクトではないと思います。

さて、返されたオブジェクトで何をしているのかわかりませんがCGColorRef、次のようなものがあったとしましょう:

CGColor colorRef = [self averageColorRect:CGRectMake(0, 0, 20, 20)];

// do something with `colorRef`

// now, all done, clean up

CGColorRelease(colorRef);        // error; you don't want this line

ゾンビをオンにしている場合、次のエラーが発生します。

-[Not A Type release]: 割り当て解除されたインスタンス 0x8de4e90 に送信されたメッセージ

これは、colorRef返されるオブジェクトが autoreleaseUIColorオブジェクトにリンクされているためです。したがって、プールがドレインさCGColorRefれると、明示的にCGColorRetain. この場合、不要な を削除すると、このエラーはなくなりCGColorReleaseます。

これがまさにあなたが行ったことだと言っているわけではありませんが、報告されたエラーを生成する可能性のある種類の例です。おそらく、結果を使用するコードをCGColorRef共有していただければ、共有されたエラーを明示するものがあるかどうかを確認できます。CGImageRelease(rawImageRef)を導入するとこのエラーが表示されるのに、それがないと生成されない理由は明らかではありませんCGImageRelease。しかし、CGImageRelease(rawImageRef)それは問題の根源ではなく、問題は間違いなく別の場所にあります。

于 2014-04-29T22:25:18.390 に答える