Iphone 目标c:for循环越来越慢

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 <

我对iPhone/iPad的编程非常陌生。我对for循环有一个问题,就像我在这个例子中使用的那样。程序按它应该的方式工作。只是,在本例中每次调用函数-void writeLabels之后,它都会变得越来越慢。谁能告诉我为什么?在本例中,需要50到100次单击才能注意到延迟。但是,一旦我将更多指令打包到循环中,程序就会变得太慢,因此只有在单击几下后才能使用。此外,自动释放池也没有帮助

- (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时都要更新这些标签,这是完全正确的,但我认为使用标签来识别和定位视图是一个丑陋而脆弱的解决方案。我建议保留对视图的实际引用。非常感谢,这很有意义。但是我是新来的:代码到底是什么样子的?是的,保留标签的引用并且只在方法中更新似乎更好。