在didReceiveMemoryWarning和viewDidUnload之后使用viewDidLoad

时间:2012-02-01 18:15:58

标签: ios memory-management viewdidload didreceivememorywarning viewdidunload

我仍在尝试了解在出现meory警告时管理视图的过程。我收到了一些good information in this answer,但我仍有疑问。

假设我有一个视图控制器 VC1,其中包含由视图控制器 VC2管理的子视图(该子视图具有视图属性)。最初,如果我想将VC2视图放到另一个VC1视图中,那么我可能会这样做:

UIView *VC2 = [UIView alloc] initWithFram...];
VC2.delegate = self;
... // other references to VC2, but not to it's view, yet.
[VC1.view addSubview VC2.view];  // At this point VC2 loadView is called automatically,
                                 // followed by VC2 viewDidLoad.

稍后,VC2会收到内存警告。所以调用VC2的didReceiveMemoryWarning,然后调用VC2的viewDidUnload。

这是我的理解结束的地方(如果我已经说过的话是正确的!)

我期望神奇地发生的是VC2中的视图及其资源可以被释放(例如,它可能是标签栏控制器引用的一个视图,但当前未显示),这应该可以解决好吧,如果它可以全部由VC2的viewDidLoad方法重新创建。假设VC2的视图暂时不可用,它应该是释放。

它是如何发布的? didReceiveMemoryWarning在VC2中执行。 VC2会发布自己的观点吗?如果没有,那么就会发生什么。

第二个问题,如果VC2的视图已经发布,假设再次需要视图(就像有人选择了标签栏上的相应标签)。我的理解是,如果引用了VC2的 view属性,则会调用VC2 loadView。最初,当VC1使用属性引用将其添加为子视图时,它被引用。标签栏控制器可以通过视图控制器VC2引用它,该视图控制器VC2位于标签栏控制器的viewControllers数组中。所以我猜标签栏控制器将引用视图属性,这导致调用VC2 loadView。

好吧,我走过了第二个问题,可能已经同时回答了。有人可以确认我是否正确理解这一点?

此外,我仍然不清楚(如我的第一个问题)应该如何以及在何处发布VC2视图。

是否有人可以指导我完成这一过程,通过整个释放视图和查看层次结构以响应内存警告的过程,同时还说明在需要时如何重新构建已发布的视图?这真的有助于我理解这个过程。

0 个答案:

没有答案