潜在的内存泄漏,我不知道为什么

时间:2011-11-18 15:45:23

标签: iphone cocoa-touch debugging memory-leaks memory-management

我有以下代码将标签添加到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];

我试图将这个版本放在这里,但它总是一样的。

我很感激你们的反馈。

4 个答案:

答案 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)

  1. 您必须在退出方法之前释放headerLabel

    [headerView release];
    
  2. 您可能应自动发布customView,除非您的方法名称包含newalloccopy字样(在这种情况下,调用者必须释放返回的视图):

    return [customView autorelease];
    

答案 3 :(得分:0)

根据你在这里的代码示例,第一个版本是正确的。 (在退货声明之后发布没有意义)。您在创建对象时获得了对象的所有权,并且需要将其释放。

您可以使用Instruments来跟踪对象的保留和释放位置;你可以看到泄漏物体的历史,看看究竟发生了什么。那将是你最好的选择。 使用Leaks仪器启动您的应用程序,当您找到泄漏的对象时,单击地址右侧的箭头。这将显示对象的历史记录 - 每次保留和释放。