为什么我的UIImage占用了这么多内存?

时间:2014-03-26 13:11:09

标签: ios objective-c uiview uiimage

我有一个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。

3 个答案:

答案 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再次开心。

希望它有所帮助!