1

在我的主视图控制器中,我有两个 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");
}

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

我究竟做错了什么?谢谢。

4

2 回答 2

1

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

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

于 2012-08-17T14:10:33.990 回答
1

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

当内存不足的情况发生并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。

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

于 2012-08-17T14:18:49.293 回答