Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用drawInRect调整图片大小的内存_Ios_Objective C_Image_Phasset - Fatal编程技术网

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

Ios 使用drawInRect调整图片大小的内存,ios,objective-c,image,phasset,Ios,Objective C,Image,Phasset,最近我用PHAssets替换了我项目中的旧资产。然而,当我用我的应用程序缩放一些图片时,我发现它通常会崩溃。 我使用调试模式,发现是内存问题。 我使用下面的代码来调整图片的大小 +(UIImage*)scaleRetangleToFitLen:(UIImage *)img sWidth:(float)wid sHeight:(float)hei{ CGSize sb = img.size;; if (img.size.height/img.size.width > he

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

  +(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通常在真正需要时才对其进行解压缩。因此,您传递到函数中的图像很可能是一个JPEG或PNG图像,iOS将其保存在内存中,并处于压缩状态。当您绘制图像时,它将首先被解压缩,因此内存会显著增加我预计会增加3264x2448x4=35MB(而不是50MB)

若要再次清除内存,请确保释放传递到函数中的图像的所有引用。因此,问题不在问题中显示的代码范围内


要获得更具体的答案,您需要显示与原始图像一起工作的所有代码。

感谢您的回答。代码如下:(我将代码添加到下面的注释中以便于阅读)上面的代码在我的答案中,刚才我尝试使用“UIImage*ti=[pv.image.image copy];”而不是“UIImage*ti=pv.image.image;”,但它不工作;似乎复制对象和原始对象链接到同一个图像,如果绘制图像,它会增加内存,但是原始对象没有设置为空闲,所以内存不会释放;这种情况有什么解决方案吗(UIImageView对象不需要35M版本,但我使用的是draw方法将其设置为35M,在绘制之后,如何将35M版本设置为小版本)似乎我不应该使用3264*2448大小的图像,我应该首先使用小版本,以便绘制不会增加太多~~