我有一个UIViewController
来实现UITableViewDelegate
和UITableViewDataSource
。我正在使用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;
}
编译器抱怨我有一个与视图相关的内存泄漏,我意识到我应该自动释放它。但是当我这样做时,当我按下后退按钮从导航控制器弹出视图时,我的应用程序崩溃了。
这是怎么回事?
答案 0 :(得分:0)
问题可能与标签有关而不是视图。
sectionHeaderLabel()方法是否返回自动释放的标签对象?如果是这样,在将其添加为要查看的子视图后,您不应该明确地释放标签。
尝试删除[标签发布];并返回[view autorelease];
答案 1 :(得分:0)
在继续进一步开发之前,您需要阅读memory management rules - 它会为您带来很多悲伤。
Clang(不是编译器)抱怨,因为你从一个方法返回+1保留对象(不匹配的init),该方法的名称表明它返回一个自动释放的对象。
然后(如Nick所述),您可能正在从sectionLabelHeader()返回一个自动释放的对象。因此,“观点”的过度保留掩盖了“标签”的过度释放。
最后,为什么使用C函数返回UILabel *?这是合法的AFAIK,但相当不正统。如果那也会让Clang绊倒我也不会感到惊讶。如果/当您转到自动参考计数(ARC)时,肯定会出现问题。我建议您使用方法,或者如果您要去工厂,则使用类方法。