【问题标题】:Why is this over-releasing? UINavigationController / UITableview为什么会过度释放? UINavigationController / UITableview
【发布时间】:2010-11-13 03:15:48
【问题描述】:

我正在从 TableViewController 的 didSelectRowAtIndexPath 方法中将视图控制器推送到导航控制器的堆栈上,如下所示:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
MyObject *myO = (MyObject *)[appDelegate.myOs objectAtIndex:indexPath.row];
myViewController.amount = myO.amount;
[self.navigationController pushViewController:myViewController animated:YES];
[myViewController release];

如果我取消注释最后一行,则应用程序在返回时崩溃并出现错误:

-[CALayer release]: message sent to deallocated instance 0xd4f860

再深入一点,我发现崩溃可以进一步缩小到 MyViewController 的 dealoc 方法中对 [super dealoc] 的调用。通过取消注释“[super dealoc]”我们不会崩溃。

我无法进一步缩小范围。 “超级”将是 UIViewController 类,我无法进一步调查该 dealoc 方法......我可以吗?也许有一种方法可以查看 0xd4f860 到底指的是什么,但我不知道如何?有什么想法吗?

【问题讨论】:

  • 你在任何地方发布 myViewController.view 吗?

标签: iphone cocoa-touch uitableview uiviewcontroller uinavigationcontroller


【解决方案1】:

你找错地方了——问题是 myViewController 被释放(或自动释放)的次数太多了。

您发布的代码看起来是正确的,所以我会查看 MyViewController 的代码,看看它是否会释放自己,或者以某种方式导致自己通过其他方式释放。

你也可以重写 release 方法,设置一个断点,看看你是否可以缩小范围......例如

- (void)release {
    [super release]; //Set breakpoint here
}

【讨论】:

  • 刚刚尝试覆盖 release 方法并在那里休息......它在进入的过程中被调用了 21 次(我假设由 didSelectRowAtIndexPath 触发),然后在退出时再调用 8 次左右看法。不知道我应该寻找什么......那里有很多框架调用(“Purple”?!?等......)
  • mythogen 提出了一个很好的观点——你应该寻找释放视图的地方(当它试图释放一个已经消失的层时,这就是最终导致异常的原因。)跨度>
  • 发现问题了,我想。至少它不再崩溃了。我有 2 个 UIView 子类实例,它们是 MyVC 视图的子视图……但也需要与 MyVC 进行通信,因此有一个属性。具有讽刺意味的是,根据您在此处评论中的说明,我使用分配(而不是保留)设置了该属性:stackoverflow.com/questions/1145380>。这是有道理的,为什么我不应该保留 VC,这样我就不会以保留周期结束……但是如果没有它,我就会崩溃。显然,我在这里仍然误解了一些东西。如果您有时间,欢迎提出建议/批评...
  • 只需重新阅读 Cocoa 内存管理编程指南中有关保留周期的章节,是的,您说“孩子”不应该保留他们的“父母”是正确的。那么为什么当我让我的子视图将 VC 分配给一个属性并且他们都没有在dealoc时释放它时它会崩溃呢?然而,当我让它们都保留然后释放一切的桃色时?对不起所有的菜鸟......不过真的很想理解这一点......
  • 听起来您的自定义子视图在保留和释放其属性方面做错了,或者即使它们应该被释放,它们也可能试图向它们的代表(超级视图)发送消息。您可能想发布一些相关的 subview-superview-controller 内存管理和消息传递代码。
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多