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

Posted

技术标签:

【中文标题】为啥我的一些视图控制器没有收到 didReceiveMemoryWarning?【英文标题】:Why don't some of my view controllers receive the didReceiveMemoryWarning?为什么我的一些视图控制器没有收到 didReceiveMemoryWarning? 【发布时间】:2011-11-29 22:10:25 【问题描述】:

我的 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】:

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

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

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

【讨论】:

以上是关于为啥我的一些视图控制器没有收到 didReceiveMemoryWarning?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“g 控制器”也不创建视图文件?

为啥我的视图控制器没有释放?

为啥我的视图控制器没有检索到我的 CoreData 对象

为啥我的用户数据没有使用资源控制器中的 show 方法传递到页面视图?

当我迅速从该视图控制器移动时,为啥我的 Collectionview 单元格没有显示?

为啥我的方法在 iPhone/iPod 上被调用了两次,但在 iPad 上却没有?