如何修复pushViewController周围的内存泄漏?

时间:2011-06-17 16:51:41

标签: ios memory-leaks

我在xcode4中运行了仪器,它告诉我下面的代码中有两个泄漏(由****注明)。我以为我已经用pt的代码处理了内存释放。 A和pt。乙

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

另一个问题是是否在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

}

提前多多谢谢! 路

2 个答案:

答案 0 :(得分:1)

A点是否需要释放/保留调用取决于您如何定义dialogTitle属性。

如果您将其定义为@property(retain),那么您不需要释放旧值或保留新值,因为当您为(retain)属性赋值时,它会自动保留。此外,当您为(保留​​)属性分配新值时,旧值将被释放,因此您也不必执行此发布。在这种情况下你需要的只是:

detailViewController.dialogTitle = title;

如果您将dialogTitle定义为(assign),那么您需要在A点进行释放/保留。

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

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

答案 1 :(得分:0)

pushViewController上面的行应该是

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

如果dialagTitle是保留属性

,这也应该有效
detailViewController.dialogTitle = title;