代码之家  ›  专栏  ›  技术社区  ›  Sean256

为什么CG Image没有发布?

  •  0
  • Sean256  · 技术社区  · 10 年前

    一段时间以来,我一直忙于一个内存泄漏的大型项目。我已成功创建了一个非常基本的CLI应用程序,该应用程序复制了该问题。

    为什么CG Image没有发布?

    enter image description here

    真正的应用程序实际上会创造出各种大小的拇指。这个演示只是反复使用相同的大小。

    这是在没有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;
    }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   f3n1kc    10 年前
    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;
        }
    }