【问题标题】:How to fix this memory leak around pushViewController?如何解决 pushViewController 周围的内存泄漏?
【发布时间】:2011-06-17 16:51:41
【问题描述】:

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

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

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

}

提前非常感谢! 陆

【问题讨论】:

    标签: ios memory-leaks


    【解决方案1】:

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

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

    detailViewController.dialogTitle = title;
    

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

    至于 B 点,您确实需要在此处释放,因为如果不这样做,您的 detailViewController 对象将永远不会被删除。当它被分配/初始化时,它的保留计数为 1。当您推送视图控制器时,它被保留(所以现在保留计数为 2)。然后你在方法结束时释放它,它的保留计数下降到 1。然后,当包含它的导航控制器被解除时,它将再次被释放,它的保留计数将变为 0,它将被删除。

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

    【讨论】:

    • rekle,感谢您的回答!那么你知道为什么 Xcode4 的泄漏工具将 pt.B 标记为泄漏吗?我应该将其视为误报还是 DialogViewController 可能存在泄漏?你有什么建议?
    【解决方案2】:

    pushViewController 上面的行应该是

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

    如果 dialagTitle 是一个保留属性,这应该也可以工作

    detailViewController.dialogTitle = title;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2021-11-18
      • 2018-04-11
      • 2020-04-07
      相关资源
      最近更新 更多