2

有没有其他人遇到过这个问题?我经常使用 NSTimer 调整图像大小。使用 Instruments 后,它没有显示任何内存泄漏,但我的 objectalloc 继续攀升。它直接指向 CGBitmapContextCreateImage。

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

-(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

5 回答 5

1

你应该发布 imageRef 吗?

CGImageRelease(imageRef);
于 2012-01-02T01:15:07.367 回答
0

只是一个健全的检查:你是否发布了返回的 UIImage - 通常我会期望一个分配新对象(在本例中为 UIImage)的函数以创建名称?

也许你想要

return [result autorelease]

?

于 2009-09-16T08:27:16.367 回答
0

如果您使用垃圾收集,请使用 CFMakeCollectable(posterFrame)。如果您使用的是传统的内存管理,则非常简单:

return (CGImageRef)[(id)posterFrame autorelease];

您将 CFTypeRef(在本例中为 CGImageRef)转换为 Objective-C 对象指针,向其发送 -autorelease 消息,然后将结果转换回 CGImageRef。此模式适用于(几乎)任何与 CFRetain() 和 CFRelease() 兼容的类型。

于 2014-08-30T08:56:30.397 回答
0

为什么不使用更简单的UIGraphicsBeginImageContext

@implementation UIImage(ResizeExtension)
- (UIImage *)resizedImageWithSize:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)interpolationQuality;
@end
@implementation UIImage(ResizeExtension)
- (UIImage *)resizedImageWithSize:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)interpolationQuality
{
    UIGraphicsBeginImageContext(newSize);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetInterpolationQuality(context, interpolationQuality);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return result;
}

@结尾

此外,这将返回当前自动释放池保留的图像;如果您在循环中创建许多这些图像,请NSAutoreleasePool手动分配和排出。

于 2009-09-16T09:59:35.333 回答
0

好的,这里的问题是我们将CGBitmapContextCreateImage的返回定义为CGImageRef,它应该是CGImage。您的分配(我假设 malloc)不断增加的原因是因为 CGImage 本身永远不会被释放。试试下面的代码。此外,不需要自动释放结果,因为它永远不会“分配”。

在您通过分配再次在仪器中运行更改后,这一次您希望不会看到活动字节的持续增加。

我是在 PC 上输入的,所以如果你把它放到 XCode 中可能会出现语法错误;但是,这应该可以解决问题。

 // Get an image from the context and a UIImage     
CGImage  cgImage = CGBitmapContextCreateImage(bitmap);     
UIImage*    result = [UIImage imageWithCGImage:cgImage];      
CGContextRelease(bitmap);   // ok if NULL     
CGImageRelease(cgImage);      
return result; 
于 2012-06-15T19:49:10.447 回答