1

ユーザーが uiview に描画できるアプリを作成しています。その uiview が通常のサイズ (1024 x 720 としましょう) であれば完璧に機能します。ただし、それを 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++;
    }
}
}
4

3 に答える 3

1

提供されたコード サンプルには、非常に大きなビューで問題を引き起こす明らかなものは何もありません。簡単なテストを行ったところ、問題なく 1024 x 10,000 のビューで描画しています。これを Instruments で実行したところ、満足できるほど例外的な結果は得られませんでした。

割り当て

Instruments を介してアプリを実行する必要があります。(a) リークがないことを確認してください。(b) 割り当てを見て、それが水平であることを確認します。成長している場合は、その成長の原因を特定する必要があります (option割り当てウィンドウでドラッグするか、ヒープショットを実行することにより)。大量の問題により、割り当てが大きくなる可能性があります ( CGReleaseCore Foundation オブジェクトの失敗、コンテキストの開始/終了の不一致など)。あなたが提供したコードサンプルには明らかなものはありません。静的アナライザー (「製品」メニューの「分析」) でコードを実行し、何かが識別されるかどうかを確認することをお勧めします。

さて、問題になる可能性があるのは、これを とUIImageを使用してrenderInContext保存することUIGraphicsGetImageFromCurrentImageContext()です。あなたはそうしているとは言っていませんが、画像を作成/保存しようとすると、それらのサイズで驚くほどの量のメモリが消費されます.

Instruments を使用してメモリの問題を追跡することに慣れていない場合は、WWDC 2012 ビデオiOS App Performance: Memoryを見ることをお勧めします。これは、このトピックに関する優れた入門書です。

于 2013-09-29T21:31:24.703 に答える
0

-drawRect:これは、関数を実装するときに UIView がメモリを割り当てるためです。

これが答え です UIScrollViewのサブビューでグリッドを描画すると、巨大なメモリが割り当てられます

于 2016-07-19T10:11:14.427 に答える
0

電話でそれよりも大きな CGrect を作成できない場合は、理由があります。電話のメモリが不足している場合は、できることはほとんどありません。別の解決策で問題に対処してみてください。ただし、電話のメモリは制限されており、悪用することはできません。

于 2013-09-29T18:53:25.010 に答える