我正在尝试制作一个非常吸引人的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的情况下绘制这么多子视图?
非常感谢!! :)
答案 0 :(得分:9)
请重新考虑你在那里做的事情:
alloc
GetColor
的一个实例 - 您再也不会使用它了。问问自己:从设计的角度来看,这是否有意义?DrawLine
的类对象(同样适用于下一行和GetColor
- 类)。 这非常糟糕! 请访问iOS开发中心的Memory Management Programming Guide并阅读前两部分(再次)!
除此之外,重新评估您的设计:
GetColor
真的应该是一个类,以便创建实例吗?在这种情况下,用于颜色插值的简单辅助函数不是更有意义吗?drawLayer:inContext:
方法的CALayer委托)。如果您以后需要更新这些行,您可以简单地(ab)使用CALayer ... 在后一种情况下,您的问题变为:
rotation
为45。self.view
图层的子图层。干杯
丹尼尔
答案 1 :(得分:2)
如果你的线条是静态的(以后没有移动,没有动画等),你也可以在一个drawRect中绘制所有线条:在一个视图中不创建1000个CALayers。 我不知道这是否比绘制1000 CALayers更快(因为CoreAnimation是硬件加速而CoreGraphics不是),但它肯定更轻,因为所有行将在单个位图中展平。 (这是你的观点的背景)
只需在drawRect中移动你的for循环:并遵循danyowde建议。(你只需要一个颜色对象或辅助函数,但不是每次迭代都创建颜色)
祝你好运,希望它有所帮助;)