关闭 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:不会调用委托?