【问题标题】:App crashes due to memory Warning on iPad 3由于 iPad 3 上的内存警告,应用程序崩溃
【发布时间】:2024-01-08 19:05:01
【问题描述】:

我在UIImage 上画线,我的图像在UIImageView 中。第一次绘图过程顺利,我将新图像分配给UIImageView,但是当我重复该过程时,它会给我内存警告和应用程序崩溃:

响应篮板的终止而终止。

我分析了我的应用程序,CG 栅格数据占用了 273 MB,总共占用了 341 MB 实时字节。还将代码包装在自动释放池中,但没有成功。我的代码

UIGraphicsBeginImageContext(imageView.image.size);

[imageView.image drawAtPoint:CGPointMake(0, 0)];


context2=UIGraphicsGetCurrentContext(); 
for(int i=0; i<kmtaObject.iTotalSize; i++)
    {
        kmtaGroup=&kmtaObject.KMTA_GROUP_OBJ[i];

        //NSLog(@"Group  # = %d",i);

        for (int j=0; j<kmtaGroup->TotalLines; j++)
        {

            lineObject=&kmtaGroup->Line_INFO_OBJ[j];

           // NSLog(@"Line # = %d",j);
           // NSLog(@"*****************");
            x0 = lineObject->x0;
            y0= lineObject->y0;
            x1= lineObject->x1;
            y1= lineObject->y1;
            color= lineObject->Color;
            lineWidth= lineObject->LinkWidth;
            lineColor=[self add_colorWithRGBAHexValue:color];
            linearColor=lineColor;

            // Brush width
            CGContextSetLineWidth(context2, lineWidth);
            // Line Color
            CGContextSetStrokeColorWithColor(context2,[linearColor CGColor]);


            CGContextMoveToPoint(context2, x0, y0);

            CGContextAddLineToPoint(context2, x1, y1);
            CGContextStrokePath(context2);

        }
    }


    newImage=UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    imageView.image=newImage;

【问题讨论】:

  • 在制作动画时您是否正在加载任何图像?
  • @VineeshTP 是的,我正在加载高分辨率图像......我的循环绘制了图像上的所有线条。图像分辨率为 7000X4000。当循环结束时,我将图像分配给 UIImageView。
  • @VineeshTP 但在我的情况下,我不能妥协图像大小.. 还有什么解决方案?
  • 我认为您发布的代码没有任何问题。您能否通过注释掉您发布的最后一行(将图像分配给图像视图)来检查图像是否是对此负责的人。您将看不到结果,但执行将完全相同,因此请检查它是否仍然泄漏内存。
  • 你是对的。您可以或多或少地复制您的代码并将其放入另一个视图的 drawRect 方法(您覆盖它)。您需要添加的是绘制一个填充颜色设置为清除颜色的全屏矩形。还要删除所有与图像相关的代码。然后需要将此视图添加到您的图像视图(或滚动视图)中。此外,在每次更改线条后,您都需要在绘制线条的视图上调用 setNeedsDisplay。

标签: ios objective-c ipad uiimageview uiimage


【解决方案1】:

所以我偶然发现了一个类似的问题。我将图像分配给图像视图,其中图像本身之前由其他对象保留,正在处理等等......结果是图像视图确实以某种方式泄漏了所有这些图像。

我使用的解决方案是在将图像分配给图像视图之前,在CGImage 级别创建图像副本。我想位图或其他东西一定有问题。无论如何尝试创建这样的副本:

CGImageRef cgCopy = CGImageCreateCopy(originalImage.CGImage);
UIImage *copiedImage = [[UIImage alloc] initWithCGImage:cgCopy scale:originalImage.scale orientation:originalImage.imageOrientation];
    CGImageRelease(cgCopy);
imageView.image = copiedImage;

【讨论】:

  • 我已经尝试过您的解决方案:我的应用程序仍然崩溃,只有一件事发生了变化,它在执行大量迭代后崩溃。在正常情况下,它工作正常。非常感谢您的帮助
  • 所以这可能解决了图像视图问题?其他地方可能还有另一个泄漏。您可以尝试注释掉图像分配和图像复制部分,看看您是否会因“大量迭代”而崩溃。
【解决方案2】:

iOS 设备使用的最大分辨率为 1024x1024。我们不能使用超过那个尺寸。为各自的设备尺寸使用 2x 和 3x 图像。

【讨论】:

  • 并不是我投了反对票,但这个答案在很多方面都是错误的。 2x 和 3x 是用于从资源文件夹中抓取相应图片资源的后缀,仅此而已。此外,内容比例为 1x、2x、3x,这些比例仅用于在使用框架、边界时保留视图坐标系。这与图像大小完全无关。关于 1024x1024,你有没有提到你从哪里得到的,因为它与真实相去甚远。