使用drawInRect调整图片大小的内存

the memory of using drawInRect to resize picture

最近我使用 PHAssets 替换我 project.However 中的旧资产,当我使用我的应用程序缩放一些图片时,我发现它通常会崩溃。 我用debug模式,发现是内存问题。 我使用下面的代码调整图片大小

  +(UIImage*)scaleRetangleToFitLen:(UIImage *)img sWidth:(float)wid sHeight:(float)hei{
    CGSize sb = img.size;;
    if (img.size.height/img.size.width > hei/wid) {
        sb = CGSizeMake(wid,wid*img.size.height/img.size.width);
    }else{
        sb = CGSizeMake(img.size.width*hei/img.size.height,hei);
    }
    if (sb.width > img.size.width || sb.height > img.size.height) {
        sb = img.size;
    }
    UIImage* scaledImage = nil;
    UIGraphicsBeginImageContext(sb);
    [img drawInRect:CGRectMake(0,0, sb.width, sb.height)];
    scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    img = nil;
    return scaledImage;
}

代码运行时内存会增加50M左右

 [img drawInRect:CGRectMake(0,0, sb.width, sb.height)] 

运行,即使方法完成也不会释放。 宽和高是304*228,图片原尺寸大约是3264*2448,返回的图片是304*228;也就是说我最后想要的真实图片只是一个304*228尺寸的图片,但是需要50 +M 内存.. 有没有办法释放 drawInRect: 函数占用的内存? (@autoreleasepool 不起作用~)

加载图像时,iOS 通常在真正需要时才解压缩。因此,您传递给函数的图像很可能是 iOS 以压缩状态保存在内存中的 JPEG 或 PNG 图像。在绘制的那一刻,它会首先解压,因此内存会显着增加。我希望增加 3264 x 2448 x 4 = 35MB(而不是 50MB)。

要再次清除内存,您将确保释放对传递给函数的图像的所有引用。所以问题出在你在问题中显示的代码之外。

要获得更具体的答案,您需要显示所有适用于原始图像的代码。