解雇UIPopoverController不会卸载contentController

时间:2012-08-17 14:03:46

标签: ios uiviewcontroller uipopovercontroller

在我的主viewController中,我有两个声明如下的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 ];

当需要关闭popover时,我按照以下方式手动执行:

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

我正在使用ARC。

在_questionnaireEditorController中我有以下内容:

- (void)viewWillUnload
{
    NSLog(@"HPSQuestionnaireEditorController viewWillUnload starting");
}

然而,这永远不会运行。 popover dismissal似乎并未实际卸载视图或托管在其中的控制器。

我做错了什么?感谢。

2 个答案:

答案 0 :(得分:1)

你没有做错任何事。 UINavigationControllers,UIPopoverControllers和UITabBarControllers在屏幕外时无需卸载视图。他们拥有缓存后端,直到它们绝对不必要或者需要内存。

如果你不需要它卸载那么你会没事的。别担心。

答案 1 :(得分:1)

当您的视图控制器被释放时,不一定要调用viewWillUnload(和viewDidUnload) - 它们通常仅在响应内存警告时被调用。根据{{​​3}},在两种方法的描述中:

  

当出现内存不足的情况和当前视图控制器时   如果不需要视图,系统可能会选择从中删除这些视图   存储器中。

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