2011-06-17 55 views
0

我在xcode4中运行仪器,它告诉我在下面的代码中有两处泄漏(由****记录)。我以为我在代码处理了内存释放的问题。 A和pt。 B.如何解决pushViewController周围的内存泄漏问题?

我在这里通读了一些相关的主题,但仍然无法弄清楚为什么以及如何解决它们。

另一个问题是,是否在pt发布。 A是必要的。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Get the dialog id 
    NSDictionary *rowData = [dialogs objectAtIndex:indexPath.row]; 
    NSInteger dialogId = [[rowData objectForKey:@"id"] intValue]; 

    DialogViewController *detailViewController = [[DialogViewController alloc] initWithNibName:@"DialogViewController" bundle:nil]; 
    detailViewController.dialogId = dialogId; 
    NSString *title = [NSString stringWithFormat:@"%d. %@", [[rowData objectForKey:@"id"] intValue], [rowData objectForKey:@"title"]]; 
       ****** i  6.8% 
    [detailViewController.dialogTitle release];    // pt. A 
    detailViewController.dialogTitle = [title retain]; 

    [self.navigationController pushViewController:detailViewController animated:YES]; 
       ****** i 93.2% 
    [detailViewController release];       // pt. B 

} 

非常感谢! 鲁

回答

1

是否释放/保持通话是必要的A点取决于关于如何定义dialogTitle属性。

如果将其定义为@property(retain),则不需要释放旧值或保留新值,因为将值分配给(retain)属性时会自动保留该值。另外,当您为(保留​​)属性分配新值时,旧值将被释放,因此您不必执行释放。所有你需要在这种情况下是:

detailViewController.dialogTitle = title; 

如果定义为DIALOGTITLE(分配),那么你需要做释放/保留在A点

至于B点,你就需要在那里释放,因为如果你不这样做,你的detailViewController对象将永远不会被删除。当它被alloc/inited时,它的保留计数为1.当你推动视图控制器时,它被保留(所以现在保留计数为2)。然后,在方法结束时释放,并且它的保留计数降为1.然后,当包含它的导航控制器被解除时,它将再次释放,它的保留计数将变为0,并且它将被删除。

作为在方法结束时释放detailViewController的替代方法,您可以在分配/初始化它时自动释放它,并在方法结束时删除释放。通过自动释放它,你基本上将它标记为在下一次自动释放池被清除时自动释放(这将在该方法退出后很快)

+0

rekle,谢谢你的回答!那么你知道为什么Xcode4的泄漏工具将pt.B标记为泄漏吗?我应该把它作为一个假阴性还是有可能是DialogViewController泄漏?你会建议什么? –

0

的pushViewController上面的线应该是

detailViewController.dialogTitle = [[title retain] autorelease]; 

这应该工作,以及如果dialagTitle是保留财产

detailViewController.dialogTitle = title;