Iphone 潜在内存泄漏,我不知道';我不知道为什么

Iphone 潜在内存泄漏,我不知道';我不知道为什么,iphone,cocoa-touch,debugging,memory-leaks,memory-management,Iphone,Cocoa Touch,Debugging,Memory Leaks,Memory Management,我有以下代码,它将标签添加到UITableView的页脚中,以便我可以格式化文本(白色等) 它工作正常,但当在带有“返回”的线路上对其进行分析时,它为“headerLabel”提供了泄漏警告 我试着到处发布,但总是一样的 我非常感谢你们的反馈。根据这里的代码示例,第一个版本是正确的。(在return语句之后发布是没有意义的)。您在创建对象时获得了该对象的所有权,需要将其释放 您可以使用仪器跟踪对象被保留和释放的位置;您可以查看泄漏对象的历史记录,以准确了解发生了什么。那将是你在这里的最佳选择。 

我有以下代码,它将标签添加到UITableView的页脚中,以便我可以格式化文本(白色等)

它工作正常,但当在带有“返回”的线路上对其进行分析时,它为“headerLabel”提供了泄漏警告

我试着到处发布,但总是一样的


我非常感谢你们的反馈。

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

您可以使用仪器跟踪对象被保留和释放的位置;您可以查看泄漏对象的历史记录,以准确了解发生了什么。那将是你在这里的最佳选择。 
使用Leaks instrument启动应用程序,找到泄漏对象后,单击地址右侧的箭头。这将向您显示对象的历史记录—每次保留和发布。

根据您在这里获得的代码示例,第一次发布是正确的。(在return语句之后发布是没有意义的)。您在创建对象时获得了该对象的所有权,需要将其释放

您可以使用仪器跟踪对象被保留和释放的位置;您可以查看泄漏对象的历史记录,以准确了解发生了什么。那将是你在这里的最佳选择。  使用Leaks instrument启动应用程序,找到泄漏对象后,单击地址右侧的箭头。这将显示对象的历史记录-每次保留和释放。

尝试

[headerLabel release];
return [customView autorelease];
试一试


自动释放customView,并确保在将其添加为子视图后释放headerLabel。无论何时调用alloc/init,您都需要确保释放这些对象。由于您要从该方法返回customView,因此延迟释放该对象(使用autorelease)是有意义的,这样调用对象就可以使用它

// 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;

自动释放customView,并确保在将其添加为子视图后释放headerLabel。无论何时调用alloc/init,您都需要确保释放这些对象。由于您要从该方法返回customView,因此延迟释放该对象(使用autorelease)是有意义的,这样调用对象就可以使用它

// 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;
  • 在退出该方法之前,必须释放
    标题标签

    [headerView release];
    
  • 您可能应该自动释放
    customView
    ,除非您的方法名称包含单词
    new
    alloc
    copy
    (在这种情况下,调用方必须释放返回的视图):

  • 在退出该方法之前,必须释放
    标题标签

    [headerView release];
    
  • 您可能应该自动释放
    customView
    ,除非您的方法名称包含单词
    new
    alloc
    copy
    (在这种情况下,调用方必须释放返回的视图):


  • 不,我不是。在Xcode 4.2上工作,但由于一个旧项目,所以我没有“现代化”它。这已经被介绍了很多次了,所以我觉得最好不要重复,搜索Cocoa内存管理。这是我第一次有潜在内存泄漏,我检查了所有关于内存管理的文档,但我只是有一个大脑障碍。对不起,不,我不是。在Xcode 4.2上工作,但由于一个旧项目,所以我没有“现代化”它。这已经被介绍了很多次了,所以我觉得最好不要重复,搜索Cocoa内存管理。这是我第一次有潜在内存泄漏,我检查了所有关于内存管理的文档,但我只是有一个大脑障碍。对不起。