在iPad上绘制大量线条(CGContextBeginPath)

Rec*_*bot 1 cocoa-touch core-graphics subview drawrect ipad

我正在尝试制作一个非常吸引人的ipad应用程序,但我的意思是在舞台上有很多行(10.000+)

使用这个简单的forloop,我的ipad在40~60秒后崩溃(没有显示结果)

for ( int i = 0; i < 10000; i++ )
    {
        int r_x = rand() % 750;
        int r_y = rand() % 1000;
        CGPoint pointpoint = CGPointMake(r_x, r_y);
        UIColor *st = [[GetColor alloc] getPixelColorAtLocation:pointpoint];
        DrawLine *drawview = [[DrawLine alloc]initWithFrame:CGRectMake(r_x, r_y, 20, 20) selectedcolor:st];
        [self.view addSubview:drawview];
        [drawview release];
        [DrawLine release];
        [GetColor release];
    }
Run Code Online (Sandbox Code Playgroud)

这是我的"DrawLine"课程:

- (id)initWithFrame:(CGRect)frame selectedcolor:colors{
    if ((self = [super initWithFrame:frame])) {
        selectedcolor_t = colors;
        self.backgroundColor = [UIColor clearColor];
    } 
    return self;
}

- (void)drawRect:(CGRect)frame{
    CGContextRef c = UIGraphicsGetCurrentContext();
    float* colors = CGColorGetComponents(selectedcolor_t.CGColor);
    CGContextSetStrokeColor(c, colors);
    CGContextBeginPath(c);
    CGContextMoveToPoint(c, 0.0f, 0.0f);
    CGContextAddLineToPoint(c, 20.0f, 20.0f);
    CGContextStrokePath(c);

}
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?如何在不崩溃iOS的情况下绘制这么多子视图?

非常感谢!!:)

dan*_*dee 9

请重新考虑你在那里做什么:

  1. 在你的循环的第4行,你alloc是一个GetColor你永远不会再使用的实例.问问自己:从设计的角度来看,这有什么意义吗?
  2. 在同一行中,如果你没有违反Cocoa的命名约定,你创建一个永不释放的UIColor ...
  3. 然后在第8行,你放开类对象DrawLine(同上,对于下一行和GetColor-class).这非常可怕!

请访问iOS开发中心的内存管理编程指南,并再次阅读前两部分!

除此之外,重新评估您的设计:

  • 应该GetColor真的是一个类,以便您创建实例?在这种情况下,用于颜色插值的简单辅助函数不是更有意义吗?
  • 如果它应该是一个类,为什么不在循环之外只创建它的一个实例,只是重复查询它的颜色?
  • 你真的需要一个UIView的子类来绘制一条直的,纯色的单色线吗?如果不需要更新这些行,你应该(正如Richard和nacho4d建议的那样)在一个对象中绘制所有这些行(例如,通过自定义UIView或实现该drawLayer:inContext:方法的CALayer委托).如果您以后需要更新这些行,您可以简单地(ab)使用CALayer ...

在后一种情况下,您的问题变为:

  1. 计算随机坐标.
  2. 计算你的颜色.
  3. 创建一个不透明的 CALayer,
    a)颜色为backgroundColor,
    b)宽度为20*sqrt(2),
    c)任何你想要宽度的高度,
    d)你的观点是它的起源和
    e)rotation45.
  4. 将该图层添加为图层的子self.view图层.

干杯
丹尼尔