0

我的 iPad 应用程序中的根级视图控制器是 UISplitViewController。因此,它有 2 个视图控制器:

  • 一个主视图控制器(viewControllers 属性的第 0 项)
  • 一个细节视图控制器(viewControllers 属性的第 1 项)

详细视图控制器是一个自定义视图控制器,我根据主视图控制器中的点击和事件进行更改。

要更改此详细视图控制器,我使用以下代码:

- (void)replaceSecondViewControllerBy:(UIViewController *)viewController {
    [[self.viewControllers objectAtIndex:1] dismissModalViewControllerAnimated:NO];
    NSArray *newVC = [NSArray arrayWithObjects:[self.viewControllers objectAtIndex:0], viewController, nil];
    self.viewControllers = newVC;
}

我的问题是,当我的应用程序收到内存警告事件时,didReceiveMemoryWarning会为我的所有视图控制器调用该方法,以前的详细视图控制器除外。而且它们没有被释放,因为它们仍然是其他对象的委托(包括可能仍在运行的异步方法)。

我的问题是:

  • UIViewController 接收didReceiveMemoryWarning消息的规则是什么?为什么我以前的细节视图控制器没有收到它们?
  • 我可以在这些旧的视图控制器上安全地打电话didReceiveMemoryWarning或自己打电话吗?viewDidUnload
4

1 回答 1

0

它看起来像是在创建时UIViewController订阅的UIApplicationDidReceiveMemoryWarningNotification。当它被解除分配时,它会移除对通知的观察。didReceiveMemoryWarning即使控制器的视图不在视图层次结构中,也会调用so 。所以确保你的控制器没有被释放。

这不太可能,但如果您碰巧使用以下代码从控制器中删除通知观察,它们也会停止监听内存通知。

[[NSNotificationCenter defaultCenter] removeObserver:controller name:nil object:nil];
于 2011-11-29T22:50:27.313 回答