我有一个UIImage,我正在加载到我的应用程序的一个视图中。它是一个10.7 MB的图像,但当它在应用程序中加载时,应用程序的资源使用量突然增加50 MB。为什么这样做?不应该使用的内存仅增加约10.7MB?我确信加载图像是导致内存使用量跳跃的原因,因为我尝试将这些行注释掉,并且内存使用量回到了大约8 MB。这是我加载图像的方式:
UIImage *image = [UIImage imageNamed:@"background.jpg"];
self.backgroundImageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:self.backgroundImageView];
如果无法减少此图像使用的内存,有没有办法强制它在我想要的时候解除分配?我正在使用ARC。
答案 0 :(得分:16)
不,它不应该是10.7MB。 10.7MB是图像的压缩大小。
加载到UIImage
对象的图像是解码图像。
对于图像中的每个像素,使用4个字节(R,G,B和Alpha),因此可以计算内存大小,高度x宽度x 4 =内存中的总字节数。
因此,当您将图像加载到内存中时,它将占用大量内存,并且由于UIImageView
用于呈现图像,因此图像保存在内存中。
您应该尝试更改图片的大小以匹配iOS屏幕尺寸的大小。
答案 1 :(得分:5)
正如@rckoenes
所说
不要显示高文件大小的图像。
您需要在显示图像之前调整图像大小。
UIImage *image = [UIImage imageNamed:@"background.jpg"];
self.backgroundImageView =[self imageWithImage:display scaledToSize:CGSizeMake(20, 20)];//Give your CGSize of the UIImageView.
[self.view addSubview:self.backgroundImageView];
-(UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
//UIGraphicsBeginImageContext(newSize);
// In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
// Pass 1.0 to force exact pixel size.
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
答案 2 :(得分:-1)
你可以做一件事。如果这张图片可以承受50 MB的费用。如果这个10 mb大小的图像对你的应用程序来说非常重要。您可以在使用它之后释放它以保持内存使用的控制。 当您使用ARC时,没有发布选项,但您可以这样做
@autoreleasepool {
UIImage *image = [UIImage imageNamed:@"background.jpg"];
self.backgroundImageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:self.backgroundImageView];
}
使用autoreleasepool它将确保在此autoreleasepool {}块内存之后将释放胖图像。让你的设备RAM再次开心。
希望它有所帮助!