Ios drawrect在非常大的uiview中,内存不足

Ios drawrect在非常大的uiview中,内存不足,ios,uiview,uiscrollview,drawrect,large-files,Ios,Uiview,Uiscrollview,Drawrect,Large Files,我正在编写一个用户可以在uiview上绘制的应用程序。如果uiview的大小是正常的(比如1024x720),它就可以完美地工作。但是,如果我将其添加到uiscrollview中,并且该维度为1024 x 3000,则速度会非常慢。此外,如果高度为10000,应用程序会当场崩溃。我想知道怎么做 - (void) drawRect: (CGRect) rect { NSLog(@"drawrect here 1"); if (self.arrayStrokes) { int ar

我正在编写一个用户可以在uiview上绘制的应用程序。如果uiview的大小是正常的(比如1024x720),它就可以完美地工作。但是,如果我将其添加到uiscrollview中,并且该维度为1024 x 3000,则速度会非常慢。此外,如果高度为10000,应用程序会当场崩溃。我想知道怎么做

- (void) drawRect: (CGRect) rect
{
    NSLog(@"drawrect here 1");

if (self.arrayStrokes)
{
    int arraynum = 0;
    // each iteration draw a stroke
    // line segments within a single stroke (path) has the same color and line width
    for (NSDictionary *dictStroke in self.arrayStrokes)
    {
        NSArray *arrayPointsInstroke = [dictStroke objectForKey:@"points"];
        UIColor *color = [dictStroke objectForKey:@"color"];
        float size = [[dictStroke objectForKey:@"size"] floatValue];
        [color set];        // equivalent to both setFill and setStroke

        //          // won't draw a line which is too short
        //          if (arrayPointsInstroke.count < 3)  {
        //              arraynum++; 
        //              continue;       // if continue is executed, the program jumps to the next dictStroke
        //          }

        // draw the stroke, line by line, with rounded joints
        UIBezierPath* pathLines = [UIBezierPath bezierPath];
        CGPoint pointStart = CGPointFromString([arrayPointsInstroke objectAtIndex:0]);
        [pathLines moveToPoint:pointStart];
        for (int i = 0; i < (arrayPointsInstroke.count - 1); i++)
        {
            CGPoint pointNext = CGPointFromString([arrayPointsInstroke objectAtIndex:i+1]);
            [pathLines addLineToPoint:pointNext];
        }
        pathLines.lineWidth = size;
        pathLines.lineJoinStyle = kCGLineJoinRound;
        pathLines.lineCapStyle = kCGLineCapRound;
        [pathLines stroke];

        arraynum++;
    }
}
}
-(void)drawRect:(CGRect)rect
{
NSLog(@“drawrect here 1”);
if(自阵列行程)
{
int-arraynum=0;
//每次迭代绘制一个笔划
//单个笔划(路径)中的线段具有相同的颜色和线宽
for(NSDictionary*self.arrayStrokes中的dictStroke)
{
NSArray*arrayPointsInstroke=[dictStroke objectForKey:@“points”];
UIColor*color=[dictStroke objectForKey:@“color”];
浮点大小=[[dictStroke objectForKey:@“size”]floatValue];
[color set];//等同于setFill和setStroke
////不会画一条太短的线
//如果(arrayPointsInstroke.count<3){
//arraynum++;
//continue;//如果执行continue,程序将跳转到下一个笔划
//          }
//使用圆形接头逐行绘制笔划
UIBezierPath*路径行=[UIBezierPath bezierPath];
CGPoint pointStart=CGPointFromString([arrayPointsInstroke objectAtIndex:0]);
[路径线移动点:点开始];
对于(int i=0;i<(arrayPointsInstroke.count-1);i++)
{
CGPoint pointNext=CGPointFromString([arrayPointsInstroke objectAtIndex:i+1]);
[pathLines addLineToPoint:pointNext];
}
pathLines.lineWidth=大小;
pathLines.lineJoinStyle=kCGLineJoinRound;
pathLines.lineCapStyle=kCGLineCapRound;
[路线笔划];
arraynum++;
}
}
}

如果手机不允许您创建一个大于此值的CGrect,这是有原因的,如果手机内存不足,您几乎无能为力,请尝试使用不同的解决方案解决您的问题,但是手机的内存是有限的,你不能滥用。

如果手机不允许你创建一个比这个大的CGrect,这是有原因的,如果手机内存不足,你可以做的很少,试着用不同的解决方案来解决你的问题,但手机内存有限,不能滥用。

提供的代码示例中没有任何明显的内容会导致超大视图出现问题。我做了一个快速测试,并在1024x1000的视图上绘制,没有任何意外。我用乐器演奏了这首曲子,结果令人满意,平淡无奇:

你应该通过仪器运行你的应用程序,并且(a)确保你没有泄漏;(b)查看分配情况,确保其处于水平。如果它正在增长,您应该确定是什么导致了增长(通过在分配窗口中拖动选项或执行堆快照)。大量的问题会导致分配增长(失败到代码> CGRLYON/COD>一些核心基础对象,不匹配的开始/结束上下文等),所以我很犹豫地猜测你的问题可能是什么。我在您提供的代码示例中没有看到任何明显的内容。我只建议通过静态分析器(“产品”菜单上的“分析”)运行代码,看看它是否能识别任何东西

现在,可能出现问题的是使用
renderInContext
UIGraphicsGetImageFromCurrentImageContext()将其保存为
UIImage
。您还没有说过要这样做,但尝试创建/保存图像将消耗这些大小的惊人内存量


如果您不熟悉使用仪器跟踪内存问题,我建议您观看WWDC 2012视频。这是一本很好的入门书。

在提供的代码示例中,没有任何明显的东西会导致大视图出现问题。我做了一个快速测试,并在1024x1000的视图上绘制,没有任何意外。我用乐器演奏了这首曲子,结果令人满意,平淡无奇:

你应该通过仪器运行你的应用程序,并且(a)确保你没有泄漏;(b)查看分配情况,确保其处于水平。如果它正在增长,您应该确定是什么导致了增长(通过在分配窗口中拖动选项或执行堆快照)。大量的问题会导致分配增长(失败到代码> CGRLYON/COD>一些核心基础对象,不匹配的开始/结束上下文等),所以我很犹豫地猜测你的问题可能是什么。我在您提供的代码示例中没有看到任何明显的内容。我只建议通过静态分析器(“产品”菜单上的“分析”)运行代码,看看它是否能识别任何东西

现在,可能出现问题的是使用
renderInContext
UIGraphicsGetImageFromCurrentImageContext()将其保存为
UIImage
。您还没有说过要这样做,但尝试创建/保存图像将消耗这些大小的惊人内存量


如果您不熟悉使用仪器跟踪内存问题,我建议您观看WWDC 2012视频。这是一本很好的入门书。

这是因为当您实现
-drawRect:
函数时,UIView将分配内存

这就是答案
这是因为当您实现
-drawRect:
函数时,UIView将分配内存

这就是答案

是的。这是我的结果。如果可能的话,你能检查一下这个代码吗。我在uiwebview scrollview上使用该uiview。我不确定是什么原因导致应用程序运行缓慢和崩溃。这是我在uiwebview scrollview中绘制的完整源代码。我收到记忆警告@KhantThuLinn我们应该把这个移到聊天:是的。这是我的结果。如果可能的话,你能检查一下这个代码吗。我用这个