iPhone - 多个CGBitmapContextCreateImage调用 - ObjectAlloc攀爬

时间:2009-09-17 02:38:06

标签: iphone memory-leaks uiimage malloc cgbitmapcontextcreate

还有其他人遇到过这个问题吗?由于CGBitmapContextCreateImage,ObjectAlloc爬升。 Apple的软件没有完全释放objectalloc吗?

我使用NSTimer每秒调整12次图像大小。在调整图像大小的过程中,我还通过包含interpolationQuality来添加类似高斯模糊效果的Photoshop。

使用仪器后,它没有显示任何内存泄漏但我的objectalloc只是继续爬升。它直接指向 CGBitmapContextCreateImage CGBitmapContextCreateImage> create_bitmap_ data_provide>的malloc

有人知道解决方案吗?甚至可能的想法?

NSTimer内的电话

NSString * fileLocation = [[NSBundle mainBundle] pathForResource:imgMain ofType:@"jpg"];
NSData * imageData = [NSData dataWithContentsOfFile:fileLocation];
UIImage * blurMe = [UIImage imageWithData:imageData];

CGRect rect = CGRectMake(0, 0, round(blurMe.size.width /dblBlurLevel), round(blurMe.size.width /dblBlurLevel)); 
UIImage * imageShrink = [self resizedImage: blurMe : rect : 3.0];   

CGRect rect2 = CGRectMake(0, 0, blurMe.size.width , blurMe.size.width ); 
UIImage * imageReize = [self resizedImage: imageShrink : rect2 : 3.0];

imgView.image = imageReize;

调整大小功能

-(UIImage *) resizedImage:(UIImage *)inImage : (CGRect)thumbRect : (double)interpolationQuality
{
    CGImageRef                  imageRef = [inImage CGImage];
    CGImageAlphaInfo    alphaInfo = CGImageGetAlphaInfo(imageRef);

    if (alphaInfo == kCGImageAlphaNone)
        alphaInfo = kCGImageAlphaNoneSkipLast;

    // Build a bitmap context that's the size of the thumbRect
    CGContextRef bitmap = CGBitmapContextCreate(
                                NULL,
                                thumbRect.size.width,
                                thumbRect.size.height,          
                                CGImageGetBitsPerComponent(imageRef),
                                4 * thumbRect.size.width,       
                                CGImageGetColorSpace(imageRef),
                                alphaInfo
                                );

    // Draw into the context, this scales the image
    CGContextSetInterpolationQuality(bitmap, interpolationQuality);
    CGContextDrawImage(bitmap, thumbRect, imageRef);

    // Get an image from the context and a UIImage
    CGImageRef  ref = CGBitmapContextCreateImage(bitmap);
    UIImage*    result = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);   // ok if NULL
    CGImageRelease(ref);

    return [result autorelease];
}

2 个答案:

答案 0 :(得分:1)

该代码过度发布result

也就是说,问题很可能是UIImage没有被释放,UIImage保留在CGImage上,而CGImage保存在CGBitmapContextCreate下分配的内存中。

使用工具查看UIImages是否未被解除分配,如果是,请尝试调试原因。

答案 1 :(得分:-1)

我编译并运行你的代码,我没有看到任何泄漏,我的对象分配也没有继续攀升。我每秒运行代码几次,并且看不到任何对象增长。我只在模拟器上运行。我也尝试了kCGInterpolationNone而不是3.0,以防出现问题,但仍然没有泄漏。

不知道为什么我没有得到它们而你做到了。您可能希望在方法中执行此操作:

-(UIImage *) resizedImage:(UIImage *)inImage : (CGRect)thumbRect : (double)interpolationQuality
{
    CGImageRef                  imageRef = [inImage CGImage];
    CGImageAlphaInfo    alphaInfo = CGImageGetAlphaInfo(imageRef);

    return inImage;
...

为了使这个方法毫无意义,然后观察对象alloc是否继续增长。如果是这样,那么问题出在其他地方。