0

我的iPad应用程序中的根级视图控制器是一个UISplitViewController。因此,它有2个视图控制器:为什么我的一些视图控制器没有收到didReceiveMemoryWarning?

  • 一个主视图控制器(在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我自己吗?

回答

0

它看起来像一个UIViewController订阅UIApplicationDidReceiveMemoryWarningNotification创建时。它在取消分配时删除观察通知。因此,即使控制器视图不在视图层次结构中,也会调用didReceiveMemoryWarning。所以确保你的控制器没有被释放。

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

[[NSNotificationCenter defaultCenter] removeObserver:controller name:nil object:nil]; 
相关问题