我有以下缩小图像的方法。但每次我使用我的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)];
图像不会缩放,但rize 20mb会消失。
答案 0 :(得分:0)
我会冒这个猜测,但我有一个理论,你可以参考你传递给比例函数的图像。然后,您将通过缩放图像覆盖图像
image = UIGraphicsGetImageFromCurrentImageContext();
然后你回来了。您确定要丢弃对原始图像的所有引用吗?否则它会在内存中等待使用。
其次,您使用imageNamed或imageWithData或imageWithContentsOfFile来获取原始图像吗? imageNamed和imageWithData(取决于您获取数据的方式)都可以使应用程序缓存文件,以便以后更快地读取速度。
我将分享一个比喻,我经过漫长而艰苦的旅程,从IOS编程的智慧圣人那里学到了“IOS会很乐意为你缓存一些东西,然而,当它开始耗尽内存时,不要指望它很好为你释放那个缓存。这就像终止你的应用程序并站在那里笑得像疯子一样。你最好避免使用缓存数据的方法,除非用户要多次访问它。“