1

我正在尝试制作一个吸引很多人的 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];
    }

这是我的“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);

}

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

非常感谢!!:)

4

2 回答 2

9

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

  1. 在循环的第 4 行,你alloc是一个实例GetColor——你再也不会使用它了。问问自己:从设计的角度来看,这是否有意义?
  2. 在同一行中,如果您不违反 Cocoa 的命名约定,您将创建一个永远不会发布的 UIColor...
  3. 然后在第 8 行释放类对象DrawLine下一行和GetColor-class 同上)。这是大错特错,大错特错!

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

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

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

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

  1. 计算你的随机坐标。
  2. 计算你的颜色。
  3. 创建一个不透明的CALayer,其中
    a) 该颜色作为其背景颜色,
    b) 宽度为 20 * sqrt(2),
    c) 高度为任何你想要的宽度,
    d)你的点作为它的原点和
    e)rotation45的a。
  4. 将该层作为子层添加到self.view's 层。

干杯
丹尼尔

于 2011-01-04T18:02:13.900 回答
2

如果您的线条是静态的(稍后不会移动,没有动画等),就像它们看起来那样,您还可以在一个 drawRect: 中绘制所有线条:在一个视图中,无需创建 1000 个 CALayers。我不知道这是否比绘制 1000 CALayers 更快(因为 CoreAnimation 是硬件加速的,而 CoreGraphics 不是)但它肯定更轻,因为所有线条都将在一个位图中展平。(这是您的观点的背景)

只需将您的 for 循环移动到您的 drawRect: 中:并遵循 danyowde 建议。(您只需要一个颜色对象或一个辅助函数,但不需要每次迭代都创建一种颜色)

祝你好运,希望它有所帮助;)

于 2011-01-04T19:00:30.910 回答