iPhone:UITableView像泰坦尼克号一样泄漏!

时间:2009-10-27 23:37:05

标签: iphone objective-c cocoa-touch uitableview

这是我的UITableView

的cellForRowAtIndexPath的代码
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *identificadorNormal = @"Normal";

        UITableViewCell *cell;

        cell = [tableView dequeueReusableCellWithIdentifier:identificadorNormal];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                               reuseIdentifier:identificadorNormal] autorelease];

            UILabel * myText = [[[UILabel alloc] initWithFrame:CGRectMake(5.0, 54.0, 225, 18)] autorelease];
            [myText setTextAlignment:UITextAlignmentLeft];
            [myText setBackgroundColor:[UIColor whiteColor ]];
            [myText setClipsToBounds:YES];
            [myText setFont:[UIFont systemFontOfSize:14.0]];
            [myText setTextColor:[UIColor blackColor]];
            [myText setAlpha:0.6];
            [myText setTag: 1];
            [cell addSubview:myText];

            UILabel * labelFRE = [[[UILabel alloc] initWithFrame:CGRectMake(235.0, 54.0, 80, 18)] autorelease];
            [labelFRE setTextAlignment:UITextAlignmentCenter];
            [labelFRE setBackgroundColor:[UIColor greenColor ]];
            [labelFRE setClipsToBounds:YES];
            [labelFRE setFont:[UIFont boldSystemFontOfSize:14.0]];
            [labelFRE setTextColor:[UIColor blackColor]];
            [labelFRE setAlpha:0.75];
            [labelFRE setTag: 2];
            [cell addSubview:labelFRE];
        }

        cell.imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
            pathForResource:[NSString stringWithFormat: @"table%d", indexPath.row] ofType:@"jpg"]];     
        NSString * preffix = [NSString stringWithFormat: @"grat%d", indexPath.row];

        UILabel *myText2 = (UILabel*)[cell viewWithTag:1];
        [myText2 setText:NSLocalizedString(preffix, @"")];

        UILabel *labelFRE2 = (UILabel*)[cell viewWithTag:2];
        [labelFRE2 setText:NSLocalizedString(@"frKey", @"")];       
        return cell;
}

这就像地狱一样泄漏。每次滚动表格时,都会在仪器列表中添加更多泄漏。

你们可以找到原因吗?

感谢您的帮助。

修改

在第一轮评论之后,我已将之前的代码更改为此

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identificadorNormal = @"Normal";

    UITableViewCell *cell;

    cell = [tableView dequeueReusableCellWithIdentifier: identificadorNormal];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
            reuseIdentifier:identificadorNormal] autorelease];

        UILabel * myText = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 54.0, 225, 18)];
        [myText setTextAlignment:UITextAlignmentLeft];
        [myText setBackgroundColor:[UIColor whiteColor ]];
        [myText setClipsToBounds:YES];
        [myText setFont:[UIFont systemFontOfSize:14.0]];
        [myText setTextColor:[UIColor blackColor]];
        [myText setAlpha:0.6];
        [myText setTag: 1];
        [cell addSubview:myText];
            [myText release];

        UILabel * labelFRE = [[UILabel alloc] initWithFrame:CGRectMake(235.0, 54.0, 80, 18)];
        [labelFRE setTextAlignment:UITextAlignmentCenter];
        [labelFRE setBackgroundColor:[UIColor greenColor ]];
        [labelFRE setClipsToBounds:YES];
        [labelFRE setFont:[UIFont boldSystemFontOfSize:14.0]];
        [labelFRE setTextColor:[UIColor blackColor]];
        [labelFRE setAlpha:0.75];
        [labelFRE setTag: 2];
        [cell addSubview:labelFRE];
            [labelFRE release];
    }

    cell.imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
        pathForResource:[NSString stringWithFormat: @"table%d", indexPath.row] ofType:@"jpg"]];     
    NSString * preffix = [NSString stringWithFormat: @"grat%d", indexPath.row];

    UILabel *myText2 = (UILabel*)[cell viewWithTag:1];
    [myText2 setText:NSLocalizedString(preffix, @"")];

    UILabel *labelFRE2 = (UILabel*)[cell viewWithTag:2];
    [labelFRE2 setText:NSLocalizedString(@"frKey", @"")];       
    return cell;
}

泄漏继续。完全没有变化。

6 个答案:

答案 0 :(得分:2)

我会避免使用autorelease,因为在自动释放池有机会耗尽之前,您可能会多次创建对象。此外,在性能激烈的情况下(例如滚动表格)并不是那么好。

修改

我应该补充,如果有混淆,而不是在这里使用autorelease,你会改为

myThing = [[Obj alloc] initWithWhatever];
[myThing doStuff];
[cell addSubview:myThing];
[myThing release];

答案 1 :(得分:2)

http://imgur.com/XPRYF这看起来不像是你的泄密。这是在设备上还是在模拟器中?

当你使用加速度计时,曾经有过泄漏的GSEvents,但那些应该已经修复了3.0。

同时尝试禁用NSAutoreleaseFreedObjectCheckEnabled,NSZombieEnabled和NSDebugEnabled,如果其中任何一个已启用,因为它已经为我多次启动了探查器。

我很好奇的另一件事就是为什么你根据它们是否脱离了再利用标准来设置不同的细胞,但这是一个单独的问题。

答案 2 :(得分:0)

您是否确认identificadorNormal@"normal"相同?如果您继续尝试使用标识符@"normal"出列但不存在的单元格,那么您将创建一个标识为identificadorNormal的单元格。如果这与@"normal"不同,那么每次tableview尝试显示单元格时,您都会继续创建新单元格。

答案 3 :(得分:0)

我想知道当UIImage加载图像时是否会发生泄漏?

您可以尝试使用+imageNamed吗?然后UIImage会缓存图像(它不会与+imageWithContentsOfFile:一起)。如果在加载图像时发生泄漏,那么应该减少泄漏,但可能不会消除它。

NSString *imageName = [NSString stringWithFormat: @"table%d.jpg", indexPath.row];
cell.imageView.image = [UIImage imageNamed:imageName];         

答案 4 :(得分:0)

我在我自己的项目中复制了你的代码,它在模拟器中泄漏,但在我的任何一台设备(iPhone 3GS,iPod Touch 2G)上都没有泄漏。

假设您在模拟器中也遇到了麻烦,我认为这只是Apple推荐您在真实设备上测试的另一个确认。

答案 5 :(得分:0)

以前从未在此发布,也不确定我是否正确地关注了这个主题。我的建议是检查你正在使用的编译器优化级别。对于某些项目(我稍后可以详细说明这种方法有用),像这样的时髦问题可以通过使用-o或-o1消失。任何更高的东西似乎都不能始终信任实例变量的初始化值。