ios - 每次缩放图像时,内存都会增加 20 MB

标签 ios memory-management uiimage uigraphicscontext

我有以下方法来缩小图像。但是每次我使用我的 ipad 2 单击图片并调用此方法时,仪器中应用程序的实际内存大小会增加 20 MB。最终使应用程序崩溃。此方法始终在主线程上运行。内存如此巨大增加的可能原因是什么? .我正在使用 ARC。

+ (UIImage*)imageWithImage:(UIImage*)image
                  scaledToSize:(CGSize)newSize
    {
        CGFloat ratioForCompressionAspect = 1.0;
        if ( image.size.width/newSize.width > image.size.height/newSize.height){
            ratioForCompressionAspect = image.size.width/newSize.width;
        }
        else{
            ratioForCompressionAspect = image.size.height/newSize.height;
        }

        newSize = CGSizeMake(image.size.width/ratioForCompressionAspect, image.size.height/ratioForCompressionAspect);

        UIGraphicsBeginImageContext(newSize);
        [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
        image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }

编辑:更多信息:如果在这一行
 [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];

我做
[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];

图像没有缩放,但 20mb 的大小消失了。

最佳答案

我会在这里冒险猜测,但我有一个理论,你有一个你传递给比例函数的图像的引用。然后,您将通过缩放图像覆盖图像

    image = UIGraphicsGetImageFromCurrentImageContext();

然后你返回它。您确定要丢弃对原始图像的所有引用吗?否则它将留在内存中,等待使用。

其次,您是否使用 imageNamed 或 imageWithData 或 imageWithContentsOfFile 来获取原始图像? imageNamed 和 imageWithData(取决于您获取数据的方式)都可能导致应用程序缓存文件,以便稍后加快读取速度。

我将分享一个经过漫长而艰辛的旅程后从一位聪明的 IOS 编程圣人那里学到的寓言“IOS 会很乐意为您缓存内容,但是,当它开始耗尽内存时,不要指望它会很好地清空该缓存对你来说。这很可能会终止你的应用程序并像疯子一样站在那里大笑。你最好避免使用缓存数据的方法,除非用户要继续多次访问它。

关于ios - 每次缩放图像时,内存都会增加 20 MB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18115486/

相关文章:

ios - iPhone 6 Plus 分辨率困惑 : Xcode or Apple's website? 用于开发

ios - Apple Pay canMakePayments Using Networks 总是返回 False

ios - 如何在不改变原始宽高比的情况下组合两个不同大小的 UIImages?

iphone - 我有一个像素长度的彩色图像,我想根据新的长度值按比例放大它。

iphone - 保留图像数组

ios - 如何从 UITableView 单元格获取数据到全局变量

iphone - FBConnect 版本

c# - 查找系统和程序内存使用情况的替代方法

c++ - std::unique_ptr 的高效内存自定义删除器?

delphi - 在 Delphi 2009 中我需要释放变体数组吗?