ios - 如何解决pushViewController 周围的内存泄漏问题?

标签 ios memory-leaks

我在 xcode4 中运行 Instrument,它告诉我以下代码中有两个泄漏(由 **** 标记)。我以为我已经用 pt 处的代码处理了内存释放。 A 和 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

}

提前非常感谢! 卢

最佳答案

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

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

detailViewController.dialogTitle = title;

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

对于B点,您确实需要在那里释放,因为如果不这样做,您的detailViewController对象将永远不会被删除。当它被分配/初始化时,它的保留计数为 1。当您推送 View Controller 时,它会被保留(因此现在的保留计数为 2)。然后,您在方法结束时释放,它的保留计数将下降到 1。然后,当包含它的导航 Controller 被关闭时,它将再次释放,它的保留计数将变为 0,并将被删除。

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

关于ios - 如何解决pushViewController 周围的内存泄漏问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6389086/

相关文章:

ios - Decode .utf8 可能无法在 swift 中正常运行吗?

c++ - 内存泄漏,指向文字的指针

ios - 识别出 NSURLConnection 的内存泄漏

android - 大 Drawable 屏幕旋转时出现内存不足错误

iOS 6.1 及更高版本使用 ARC 有泄漏

ios - 如何在 Swift 中创建一个 UIPickerView 选择,以便 View 扩展以允许添加选项?

ios - 如何深度链接到 OpenTable

ios - 在iOS和OS X之间共享iCloud Core数据

c++ - alloca 返回的指针的基于索引的访问和 "placement new"的效果

ios - ARKit - 你能在 session 中改变 planeDetection 吗?