UITableView viewForHeaderInSection-自动释放视图崩溃应用程序

时间:2012-01-14 02:32:05

标签: ios uitableview

我有一个UIViewController来实现UITableViewDelegateUITableViewDataSource。我正在使用viewForHeaderInSection方法自定义节标题:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

UILabel *label = sectionHeaderLabel();

switch (section) {
    case 0:
        label.text = @"";
        break;
    case 1:
        label.text = @"Points";
        break;
    case 2:
        label.text = @"Problems";
        break;
    default:
        label.text = @"";
        break;
}

// Create header view and add label as a subview
UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
[view addSubview:label];
[label release];

return view;

}

编译器抱怨我有一个与视图相关的内存泄漏,我意识到我应该自动释放它。但是当我这样做时,当我按下后退按钮从导航控制器弹出视图时,我的应用程序崩溃了。

这是怎么回事?

2 个答案:

答案 0 :(得分:0)

问题可能与标签有关而不是视图。

sectionHeaderLabel()方法是否返回自动释放的标签对象?如果是这样,在将其添加为要查看的子视图后,您不应该明确地释放标签。

尝试删除[标签发布];并返回[view autorelease];

答案 1 :(得分:0)

在继续进一步开发之前,您需要阅读memory management rules - 它会为您带来很多悲伤。

Clang(不是编译器)抱怨,因为你从一个方法返回+1保留对象(不匹配的init),该方法的名称表明它返回一个自动释放的对象。

然后(如Nick所述),您可能正在从sectionLabelHeader()返回一个自动释放的对象。因此,“观点”的过度保留掩盖了“标签”的过度释放。

最后,为什么使用C函数返回UILabel *?这是合法的AFAIK,但相当不正统。如果那也会让Clang绊倒我也不会感到惊讶。如果/当您转到自动参考计数(ARC)时,肯定会出现问题。我建议您使用方法,或者如果您要去工厂,则使用类方法。