我在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
}
提前多多谢谢! 路
答案 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;