【问题标题】:UIViewController -dealloc method not calledUIViewController -dealloc 方法未调用
【发布时间】:2013-04-28 16:18:12
【问题描述】:

我正在使用自动引用计数。 我有一个自定义的UIViewController 子类,每当我调用-presentViewController: animated:completion: 或从父视图中删除它的视图时,我想NSLog 类似“我被释放”这样我知道视图控制器已成功删除。我已经在我的视图控制器中实现了-dealloc 方法。但是,我开始了一个测试项目,其中我只有两个 UIViewController 实例(没有保留周期),并且当我以模态方式推送第二个 UIViewController 或删除超级视图或将其从父视图控制器。我错过了什么吗?在我的原始项目(不是测试用例)中,Instruments 向我展示了这些控制器留下了我无法摆脱的内存占用。

【问题讨论】:

  • @ThilinaHewagama -viewDidDisappear: 确实有效,但这种方法是否表明解除分配?
  • 我从来没有开启过 NSZombieEnabled,我认为这个问题在 iOS6 中已经解决了。
  • 从您在 Github 上发布的内容中根本不清楚您要做什么。从窗口中删除控制器的视图不会释放控制器。你应该在这里发布一个你正在做的例子——显示你认为应该被释放的控制器的整个代码。它有助于在上下文中查看它。
  • @rdelmar 我认为删除控制器的视图也会释放控制器......但是是的,我试图真正摆脱整个控制器而不仅仅是视图,以便视图控制器被释放.
  • 如何做到这一点很大程度上取决于您的结构。关闭呈现的控制器或从导航堆栈中弹出控制器都应该导致释放。另外,如果你只是切换窗口的根视图控制器,而你的就是你要切换的那个,那也会导致它被释放。

标签: ios objective-c uiviewcontroller automatic-ref-counting dealloc


【解决方案1】:

如果您想切换视图控制器,并让您要切换的视图控制器被释放,那么只需切换窗口的根视图控制器。所以,如果你在 VC1 并想去 VC2,那么在 VC1 中执行此操作:

VC2 *vc2 = [[VC2 alloc] init]; // or however else is appropriate to get an instance of this class
self.view.window.rootViewController = vc2;

如果您尚未创建任何指向 vc1 的属性,则在进行此切换后它将被释放。

如果您想使用模态演示或模态segue(在切换控制器时获取动画),您仍然可以通过在演示后从 viewDidAppear 方法切换根视图控制器来释放初始控制器vc2:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.view.window.rootViewController = self;
}

【讨论】:

  • 完美!正是我需要的。感谢您的耐心 rdelmar,祝您有美好的一天 :)。
【解决方案2】:

要在视图控制器被释放时打印,你可以实现 dealloc 方法

- (void) dealloc {
    NSLog(@"The instance of MyViewController was deallocated");
}

然后在 View Controller 离开视图时得到一个 print 你可以实现

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"The instance of MyViewController left the main view")
}

【讨论】:

  • 对不起,我应该在我的问题中包括我已经打电话给-dealloc。问题是,它根本没有被调用......
【解决方案3】:

如果您使用-presentViewController:animated:completion:,则每次调用此方法时都会保留 parentViewController。 ModalViewController 被简单地推到另一个 ViewController 之上。

ModalViewControllers 只为某种信息/用户输入和类似的东西而设计。如果你想释放 ParentViewController,你必须处理你自己的实现。

【讨论】:

  • 感谢您的回答,它很有用。但问题是,我并没有真正调用-presentViewController:animated:completion: 方法。我只是试图举例说明我的情况。实际上,我只是将自定义 VC 的视图添加到另一个未连接到旧 VC 的超级视图中。
  • 试着看看乐器。这里的问题是您只从超级视图中删除视图,而 ViewController 被其他一些对象保留。解决此问题的最佳方法是查看工具并查找在对象上调用的保留和释放。
  • 好的,谢谢 mariusLAN。我对 Instruments 不是特别熟悉,我应该使用哪种工具来查看保留/释放?
【解决方案4】:

当类被保留(或者这个类中的某些东西被保留)并且没有被释放时,不会调用dealloc方法。它适用于有 ARC 和没有 ARC 的项目。所以检查你的代码两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多