为什么我的一些视图控制器没有收到didReceiveMemoryWarning?

时间:2011-11-29 22:10:26

标签: ios memory uisplitviewcontroller didreceivememorywarning

我的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消息的规则是什么?为什么我之前的详细视图控制器没有收到它们?
  • 我可以安全地在这些旧视图控制器上呼叫didReceiveMemoryWarningviewDidUnload吗?

1 个答案:

答案 0 :(得分:0)

UIViewController在创建时UIApplicationDidReceiveMemoryWarningNotification订阅。它会在取消分配时删除观察通知。因此,即使控制器的视图不在视图层次结构中,也会调用didReceiveMemoryWarning。因此,请确保您的控制器未被释放。

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

[[NSNotificationCenter defaultCenter] removeObserver:controller name:nil object:nil];