【问题标题】:Dismissing a UIPopoverController does not unload contentController关闭 UIPopoverController 不会卸载 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");
}

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

我做错了什么?谢谢。

【问题讨论】:

    标签: ios uiviewcontroller uipopovercontroller


    【解决方案1】:

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

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

    【讨论】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-02
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2010-10-29
      • 1970-01-01
      • 2012-12-28
      相关资源
      最近更新 更多