2012-01-14 163 views
0

我有一个UIViewController,实现UITableViewDelegateUITableViewDataSource。我自定义使用viewForHeaderInSection方法节标题:UITableView 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

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

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

尝试删除[label release];并返回[查看autorelease];

+0

Spot-on!谢谢! – jay492355 2012-01-14 18:12:38

+0

如果这是一个新项目,并且您不支持iOS 3.x,则可能需要尝试打开ARC。它会为你节省这些错误。 – 2012-01-17 09:21:57

0

在继续进一步开发之前,您需要详细阅读memory management rules - 这将为您节省很多的痛苦。

Clang(不是编译器)抱怨是因为你从名称指示它返回一个自动释放对象的方法返回+1保留对象(不匹配的init)。然后(就像Nick说的那样),你可能会从sectionLabelHeader()返回一个自动释放对象。因此,“观看”的过度保留掩盖了“标签”的过度释放。

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

+0

感谢您使用方法代替C函数的建议。我想知道:如果我使用各种预设属性(字体大小,文本颜色等)的自定义标签,并在众多视图中使用,最好使用UILabel子类,使用类别扩展UILabel,或者只需调用工厂方法? – jay492355 2012-01-14 18:22:18

+0

如果你需要*覆盖*方法,我会说只有子类。如果你所做的只是设置属性,那么UILabel上的一个类别可能就是要走的路。只要确保前缀(好吧,我个人更喜欢后缀为可读性)的方法,所以你不要与任何目前或未来的私人方法冲突。类似于+ labelWithCustomProperties_JAG {}。 – 2012-01-14 19:23:21