关闭 UIPopoverController 不会卸载 contentController

Posted

技术标签:

【中文标题】关闭 UIPopoverController 不会卸载 contentController【英文标题】:Dismissing a UIPopoverController does not unload contentController 【发布时间】:2012-08-17 14:03:46 【问题描述】:

在我的主视图控制器中,我有两个 ivars 声明如下:

UIPopoverController* __popoverController;
HPSQuestionnaireEditorController* _questionnaireEditorController;

然后我显示一个 UIPopOver 如下:

_questionnaireEditorController = [ [ HPSQuestionnaireEditorController alloc ] initWithNibName:nil bundle:nil ];
__popoverController.delegate = self;
[__popoverController setPopoverContentSize:CGSizeMake(400, 500)];
[_questionnaireEditorController setContentSizeForViewInPopover:CGSizeMake(400, 500)];
[__popoverController presentPopoverFromRect:editWrapper.frame inView:editWrapper.superview permittedArrowDirections:UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight animated:YES ];

当需要关闭弹出框时,我手动执行以下操作:

[__popoverController dismissPopoverAnimated:YES ];
__popoverController = nil;
_questionnaireEditorController.view=nil;
_questionnaireEditorController=nil;

我正在使用 ARC。

在 _questionnaireEditorController 我有以下内容:

- (void)viewWillUnload

    NSLog(@"HPSQuestionnaireEditorController viewWillUnload starting");

但是,这永远不会运行。弹出框解除似乎并没有真正卸载视图或其中托管的控制器。

我做错了什么?谢谢。

【问题讨论】:

【参考方案1】:

你没有做错任何事。 UINavigationControllers、UIPopoverControllers 和 UITabBarControllers 不需要在离开屏幕时立即卸载视图。他们有缓存后端,可以保留它们,直到它完全没有必要或者他们需要内存。

如果您不需要卸载它,那么您会没事的。不用担心。

【讨论】:

问题是我实际上想卸载控制器 - 我依靠 viewWillUnload 取消注册一些通知 你不应该那样做。您应该取消注册 viewWillDisappear 或 ViewDidDisappear 上的通知。一般来说,当然。【参考方案2】:

viewWillUnload(和 viewDidUnload)在你的视图控制器被释放时不一定被调用——它们通常只在内存警告时被调用。根据UIViewController reference,在这两种方法的描述中:

当内存不足的情况发生并且当前视图控制器的 不需要视图,系统可能会选择从 记忆。

如果有任何必要的清理,请在 dealloc 中进行。如果清理只是将保留属性设置为 nil 并且您使用的是 ARC,则无需为 dealloc 操心。

【讨论】:

以上是关于关闭 UIPopoverController 不会卸载 contentController的主要内容,如果未能解决你的问题,请参考以下文章

按下外部时 UIPopoverController 不会自动关闭

在 iOS 8 UIActivityViewController 和/或 UIPopoverController 之外单击时不会关闭它们

用 -dismissPopoverAnimated 解散 UIPopoverController:不会调用委托?

让 UIPopoverController 不因外部接触而辞职?

UIPopoverController:关闭后更新视图

UIPopoverController 不关闭