我有以下代码将标签添加到UITableView的页脚中,以便我可以格式化文本(白色等)
它工作正常,但是当它在“返回”行上进行分析时,它给出了“headerLabel”的泄漏警告
// create the parent view that will hold header Label
UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 15.0, 300.0, 44.0)];
// create the button object
UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
headerLabel.backgroundColor = [UIColor clearColor];
headerLabel.opaque = NO;
headerLabel.textColor = [UIColor whiteColor];
headerLabel.highlightedTextColor = [UIColor whiteColor];
headerLabel.font = [UIFont systemFontOfSize:14];
headerLabel.textAlignment=UITextAlignmentCenter;
headerLabel.frame = CGRectMake(10.0, 0.0, 300.0, 75.0);
headerLabel.numberOfLines=4;
if (section==0) {
headerLabel.text = @"If turned off, the last used settings will be used on the next session\n\n"; // i.e. array element
}
[customView addSubview:headerLabel];
//[headerLabel release];
return customView;
// [customView release];
我试图将这个版本放在这里,但它总是一样的。
我很感激你们的反馈。
答案 0 :(得分:1)
尝试
[headerLabel release];
return [customView autorelease];
答案 1 :(得分:1)
自动发布您的customView,并确保在将其添加为子视图后释放headerLabel。无论何时调用alloc / init都需要拥有所有权,您需要确保释放这些对象。由于您从此方法返回customView,因此推迟释放该对象(使用自动释放)是有意义的,因此调用对象可以使用它。
// create the parent view that will hold header Label
UIView* customView = [[[UIView alloc]
initWithFrame:CGRectMake(0.0, 15.0, 300.0, 44.0)]
autorelease];
// create the button object
UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
headerLabel.backgroundColor = [UIColor clearColor];
headerLabel.opaque = NO;
headerLabel.textColor = [UIColor whiteColor];
headerLabel.highlightedTextColor = [UIColor whiteColor];
headerLabel.font = [UIFont systemFontOfSize:14];
headerLabel.textAlignment=UITextAlignmentCenter;
headerLabel.frame = CGRectMake(10.0, 0.0, 300.0, 75.0);
headerLabel.numberOfLines=4;
if (section==0) {
headerLabel.text = @"If turned off, the last used settings will be used on the next session\n\n"; // i.e. array element
}
[customView addSubview:headerLabel];
[headerLabel release];
return customView;
答案 2 :(得分:1)
您必须在退出方法之前释放headerLabel
:
[headerView release];
您可能应自动发布customView
,除非您的方法名称包含new
,alloc
或copy
字样(在这种情况下,调用者必须释放返回的视图):
return [customView autorelease];
答案 3 :(得分:0)
根据你在这里的代码示例,第一个版本是正确的。 (在退货声明之后发布没有意义)。您在创建对象时获得了对象的所有权,并且需要将其释放。
您可以使用Instruments来跟踪对象的保留和释放位置;你可以看到泄漏物体的历史,看看究竟发生了什么。那将是你最好的选择。 使用Leaks仪器启动您的应用程序,当您找到泄漏的对象时,单击地址右侧的箭头。这将显示对象的历史记录 - 每次保留和释放。