Iphone 目标c:for循环越来越慢
我对iPhone/iPad的编程非常陌生。我对for循环有一个问题,就像我在这个例子中使用的那样。程序按它应该的方式工作。只是,在本例中每次调用函数-void writeLabels之后,它都会变得越来越慢。谁能告诉我为什么?在本例中,需要50到100次单击才能注意到延迟。但是,一旦我将更多指令打包到循环中,程序就会变得太慢,因此只有在单击几下后才能使用。此外,自动释放池也没有帮助Iphone 目标c:for循环越来越慢,iphone,objective-c,cocoa-touch,ios,loops,Iphone,Objective C,Cocoa Touch,Ios,Loops,我对iPhone/iPad的编程非常陌生。我对for循环有一个问题,就像我在这个例子中使用的那样。程序按它应该的方式工作。只是,在本例中每次调用函数-void writeLabels之后,它都会变得越来越慢。谁能告诉我为什么?在本例中,需要50到100次单击才能注意到延迟。但是,一旦我将更多指令打包到循环中,程序就会变得太慢,因此只有在单击几下后才能使用。此外,自动释放池也没有帮助 - (void) writeLabels { label_y = 0; for (i = 0; i <
- (void) writeLabels {
label_y = 0;
for (i = 0; i < 23; i++) {
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(i * i, label_y, 39, 39)];
label.textColor = [UIColor whiteColor];
if (offset == i) {
label.backgroundColor = [UIColor blackColor];
}
else label.backgroundColor = [UIColor blueColor];
[label setText:[NSString stringWithFormat:@"%d", i]];
[self.view addSubview:label];
[label release];
label_y += 40;
}
}
- (IBAction) pushPlus {
++offset;
if (offset == 23) offset = 0;
[self writeLabels];
}
在writeLabels方法中,您将添加标签作为子视图。但您从未删除以前的标签。因此,在第一次调用之后,您有24个标签子视图,在第二次调用之后,您有48个标签子视图,依此类推。每次调用的内存消耗都会增加,程序会变慢,最终可能会崩溃,尽管这里没有内存泄漏。这不是泄漏,但您将不必要的东西保留在内存中。我想第二、第三。。。调用之前的标签不是必需的,毕竟您在每次调用中都在同一位置创建它们。保留跟踪添加标签的方法可以是使用标签,并在添加新标签之前从superview中删除以前的标签
编辑:按照乔纳的建议,将标签作为类的成员会更好。大概是这样的:
- (id)init {
if (self = [super init]) {
// labelsArray is a member of the class
labelsArray = [[NSMutableArray alloc] initWithCapacity:24];
NSInteger label_y = 0;
for (NSInteger i = 0; i < 23; i++) {
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(i * i, label_y, 39, 39)];
[labelsArray addObject:label];
[label release];
label_y += 40;
}
}
}
- (void)viewDidLoad {
for (NSInteger i = 0; i < 23; i++) {
UILabel *label = (UILabel *) [labelsArray objectAtIdex:i];
[self.view addSubview:label];
label.text = [NSString stringWithFormat:@"%d", i];
}
}
- (void) dealloc {
[labelsArray release];
}
- (void) writeLabels {
for (NSInteger i = 0; i < 23; i++) {
if (offset == i) {
label.backgroundColor = [UIColor blackColor];
} else {
label.backgroundColor = [UIColor blueColor];
}
}
[self.view addSubview:label]
每次调用此方法时,都会向视图中添加一个子视图。您永远不会删除这些子视图中的任何一个子视图,因此每次方法调用都会增加内存使用量
而不是每次都创建新标签,只构建一次标签。在控制器中保留对它们的引用,作为字典或标签数组。每次调用writelabel时都要更新这些标签,这是完全正确的,但我认为使用标签来识别和定位视图是一个丑陋而脆弱的解决方案。我建议保留对视图的实际引用。非常感谢,这很有意义。但是我是新来的:代码到底是什么样子的?是的,保留标签的引用并且只在方法中更新似乎更好。