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

你永远不会释放rawImageRef

我会CGImageRelease(rawImageRef);在发布后立即打电话data

于 2014-04-29T20:00:16.110 回答
0

解决了!我添加了_imageRaster。CGIMage并在发布后!!谢谢!

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您返回的对象链接到自动释放UIColor对象,因此,当池耗尽时,CGColorRef除非您执行明确的CGColorRetain. 在这种情况下,如果您删除不必要的CGColorRelease.

我并不是说这正是您所做的,但它说明了可以生成您报告的错误的那种事情。也许您可以共享使用结果的代码,CGColorRef我们可以查看是否有任何内容可以显示您与我们共享的错误。目前尚不清楚为什么引入CGImageRelease(rawImageRef)会导致出现此错误,而在没有 that 的情况下不会产生CGImageRelease。但这CGImageRelease(rawImageRef)不是问题的根源,而问题无疑在于其他地方。

于 2014-04-29T22:25:18.390 回答