虚拟机:CG光栅数据内存持续增长问题

5

我正在尝试制作一个应用程序,让用户可以更改UIImage的颜色。为此,我正在使用我找到的这个函数:

 - (UIImage *)imageWithTintColor:(UIColor *)color fraction:(CGFloat)fraction
{
    if (color)
    {
        UIImage *image;
        if ([UIScreen instancesRespondToSelector:@selector(scale)])
        {
            UIGraphicsBeginImageContextWithOptions([self size], NO, 0.f);
        }
        else
       {
           UIGraphicsBeginImageContext([self size]);
       }

       CGRect rect = CGRectZero;
       rect.size = [self size];
       [color set];
       UIRectFill(rect);

       [self drawInRect:rect blendMode:kCGBlendModeDestinationIn alpha:1.0];

       if (fraction > 0.0)
       {
           [self drawInRect:rect blendMode:kCGBlendModeSourceAtop alpha:fraction];
       }
       image = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
       return image;
   }
   return self;
}

一切都正常,但CG光栅数据在内存中不断增加。

enter image description here

大约200-300kb,我看到那些200、300kb...但最终却是30MB。 - sken3r.MI
图片的尺寸是多少?是3000x2000像素吗?我猜这是在iPad模拟器上? - Vitalii Gozhenko
图片尺寸为1240x1240,是iPad的,但我可以向您展示iPhone的规格,仍然没有变化。我听说过要放置@autoreleasepool,但对我没有用...或者我不确定在哪里设置它。 - sken3r.MI
问题可能在于其他方面:UIImageView在大iPad屏幕上显示大图像时会占用很多内存。 - Vitalii Gozhenko
而且你需要在真实设备上进行分配内存的配置文件(因为模拟器无法显示真实的内存使用情况),而不是在模拟器上。这样,从模拟器和真实设备上得到的结果会有很大的不同。 - Vitalii Gozhenko
显示剩余4条评论
2个回答

0
我找到了问题所在,原来是我的逻辑有误。我使用了两个视图,一个用于显示,另一个用于操作(例如:调整大小、移动、旋转)。每次我都向这两个视图中添加子视图,其中一个只需要同时容纳一个子视图,解决方法很简单:
  for (UIView *view in 2cndView.subviews)
  {
    [view removeFromSuperview];
  }

对我很有帮助


0
我一直在与我的应用程序作斗争,因为它突然无法正常启动已经有一段时间了。原来当我将许多图像的Render asStandard切换到Template时,在图像资源文件中,这导致应用程序完全崩溃。CG Raster Data呈指数增长,最终导致应用程序停止运行,Xcode只是说:

失去与iPhone的连接...检查连接等

似乎每次启动时都会重新处理这些“模板”设置的图像,这消耗了大量的RAM,并使其无法启动。为了解决这个问题,我降低了图像的分辨率-就这么简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接