【问题标题】:iPhone - when is dealloc for a viewcontroller called?iPhone - 何时调用视图控制器的 dealloc?
【发布时间】:2009-02-23 13:33:04
【问题描述】:

我正在使用 UINavigationController 在视图之间移动。当我在视图中来回移动时,我的应用程序使用的内存不断增加。在将 NSLog 语句放在所有视图控制器的 dealloc 方法中时,我注意到它只被一些视图控制器调用,而不是所有被弹出的视图控制器。

例如,这是推送视图的顺序 MainViewController -> viewcontroller1 -> viewcontroller2 -> viewcontroller3

现在在 viewcontroller3 中,如果我执行 popToViewController:mainController,则仅为 viewcontroller3 调用 dealloc。 viewcontroller1 和 2 不调用它。

谁能告诉我为什么会这样。

发现问题。如果视图控制器持有的任何引用仍在内存中,则不会调用 dealloc 方法。在我的情况下,它是未在 viewcontroller1 和 viewcontroller2 中释放的 MPMoviePlayerController 对象。

【问题讨论】:

  • 我遇到了完全相同的问题;仅对第三个控制器调用 dealloc。您说“如果视图控制器持有的任何引用仍在内存中,则不会调用 dealloc 方法。”你能详细说明一下吗?
  • 视图控制器是仍在使用的对象的委托。我将其从代表中删除,然后它运行良好。因为另一个对象持有它的引用(作为委托),所以没有被释放

标签: iphone


【解决方案1】:

这是一种后开先关的情况。因此,如果您想象您的第一个视图控制器是汉堡的底部面包,然后添加汉堡(第二个视图控制器),然后添加顶部汉堡(第三个视图控制器)。

如果你回到汉堡,你会取下顶部的面包(popViewController:调用弹出视图的 dealloc 方法)。如果你想回到底部的面包,那么你必须弹出汉堡(每次弹出视图时都会调用dealloc)。

不知道为什么在 pop to root 时不会调用第二个视图控制器的 dealloc..

【讨论】:

  • 谢谢丹。令我惊讶的是,某些类而不是其他类调用了dealloc。您是否知道可能发生这种情况的任何情况?
  • 我面临同样的问题,我也有两个视图控制器,当从导航堆栈弹出时,第二个视图控制器的 dealloc 没有被调用。
【解决方案2】:

在你浏览你的控制器的地方应该需要在 pushviewcontroller 之后写下这一行, [viewControllername 发布]; 那么它将调用每个视图控制器的 Dealloc 方法:)

【讨论】:

  • 这不是对所提问题的实际答案,对于新的 ObjC 开发人员来说,这更像是一个“要记住的要点”。
【解决方案3】:

您还应该记住,dealloc 并不总是保证运行。

【讨论】:

  • 这是不正确的。 Dealloc 将在对对象的最后一个引用被释放时运行。
  • 不完全不正确,如果应用程序根据 Cocoa 的内存管理编程指南退出,这是正确的。
【解决方案4】:

使用类似 [self.navigationController popToRootViewControllerAnimated:YES]; 它对我有用...调用我的 10 个视图控制器的所有 dealloc 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多