我在 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/