【问题标题】:Why is CG Image not being released?为什么CG Image没有发布?
【发布时间】:2015-03-06 22:37:37
【问题描述】:

一段时间以来,我一直在为一个内存泄漏的大型项目而努力。我已经设法创建了一个非常基本的 CLI 应用程序来复制问题。

为什么没有发布CG Image?

真正的应用程序实际上会创建一堆不同大小的拇指。这个只是演示只是一遍又一遍地使用相同的大小。

这是在没有 ARC 的情况下编译的。

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSString * image = @"/Users/sean/Pictures/wallpaper/7gjMT.jpg";
        NSData * imageData = [NSData dataWithContentsOfFile:image];

        CFDataRef imgData = (CFDataRef)imageData;
        CGImageRef imgRef;
        CGDataProviderRef imgDataProvider = NULL;
        imgDataProvider = CGDataProviderCreateWithCFData(imgData);
        imgRef = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);
        CGDataProviderRelease(imgDataProvider);

        for (int i = 0; i < 50; i++) {
            // create context, keeping original image properties
            CGColorSpaceRef colorspace = CGImageGetColorSpace(imgRef);

            CGContextRef context = CGBitmapContextCreate(NULL, 2560, 1440,
                                            CGImageGetBitsPerComponent(imgRef),
                                            CGImageGetBytesPerRow(imgRef),
                                            colorspace,
                                            kCGImageAlphaPremultipliedFirst);

            CGColorSpaceRelease(colorspace);

            // draw image to context (resizing it)
            CGContextDrawImage(context, CGRectMake(0, 0, 2560, 1440), imgRef);

            // extract resulting image from context
            CGImageRef newImgRef = CGBitmapContextCreateImage(context);

            CGImageRelease(imgRef);
            imgRef = newImgRef;
        }
    }
    return 0;
}

【问题讨论】:

    标签: objective-c xcode macos core-graphics


    【解决方案1】:
    1. 永远不会释放上下文。将 CGContextRelease(context); 添加到您的 for 循环中
    2. 您可能希望在for 循环中添加内容到@autoreleaspool{}
    for (int i = 0; i < 50; i++) {
    
      @autoreleaspool { 
            CGColorSpaceRef colorspace = CGImageGetColorSpace(imgRef);
    
            CGContextRef context = CGBitmapContextCreate(NULL, 2560, 1440,
                                            CGImageGetBitsPerComponent(imgRef),
                                            CGImageGetBytesPerRow(imgRef),
                                            colorspace,
                                            kCGImageAlphaPremultipliedFirst);
    
            CGColorSpaceRelease(colorspace);
    
            // draw image to context (resizing it)
            CGContextDrawImage(context, CGRectMake(0, 0, 2560, 1440), imgRef);
    
            // extract resulting image from context
            CGImageRef newImgRef = CGBitmapContextCreateImage(context);
    
            CGImageRelease(imgRef);
            CGContextRelease(context);
    
            imgRef = newImgRef;
        }
    }
    

    【讨论】:

    • 哈哈,你说的太对了。我实际上在我复制此代码的主项目中拥有它,当我将其浓缩时它以某种方式遗漏了。虽然你帮我修复了这个小测试循环,但主项目仍然存在同样的问题,这意味着它在其他地方。再次感谢。
    猜你喜欢
    • 2023-03-16
    • 2017-03-23
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2021-11-23
    • 2014-02-24
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多