0

有没有其他人遇到过这个问题?ObjectAlloc 作为 CGBitmapContextCreateImage 的结果而攀升。苹果的软件没有完全释放objectalloc吗?

我正在使用 NSTimer 每秒 12 次调整图像大小。在调整图像大小的过程中,我还通过包含插值质量来添加像高斯模糊效果这样的 Photoshop。

使用 Instruments 后,它没有显示任何内存泄漏,但我的 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];
}
4

2 回答 2

1

该代码过度发布result

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

使用工具查看 UIImages 是否没有被释放,如果是,请尝试调试原因。

于 2009-09-17T02:52:11.277 回答
-1

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

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

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

    return inImage;
...

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

于 2009-09-17T03:00:06.070 回答