我有1个父控制器和1个视图控制器。我已成功执行addChildViewController
和transitionFromViewController
函数,以利用iPhone SDK提供的Containment API。然而,在我真正将视图控制器传递给这些函数之前,我有几个问题
问题1 :在ParentVC ViewDidLoad
方法中,我必须使用以下
UIViewController* child = [self.storyboard instantiateViewControllerWithIdentifier:identifier];
或 self.myViewController = [[MyViewController alloc] init];
问题2 :假设我最初在我的ViewDidLoad
中没有实例化所有4个子视图...每次我使用addChildViewController
添加新的孩子之前我执行使用transitionFromViewController
转换,我是否需要实例化我希望添加的子VC?
问题3 :在问题1和/或问题2的答案为“是”的情况下,必须对内存管理做些什么。对于问题1,当从子VC导航回父VC时,似乎意味着将创建4个子视图控制器的新对象,对吗?在查看问题2时,当进行转换时(通常是转换),似乎每次都会创建子视图控制器对象的新副本。实质上,在父和子之间以及子视图和子视图之间的某些转换之后,此应用程序可能变得非常臃肿。
问题4 :调用transitionFromViewController
时,内存中发生了什么?在父子转换中父VC会发生什么?儿童VC在儿童 - 子女过渡期会发生什么?
更新:来自this particular tutorial的以下引用似乎是指我的一些担忧(强调增加):
请注意,
self.storyboard
未设置init
。在这一刻, 没有一个放置这个初始化代码的好地方。一种选择 是覆盖setStoryboard:
而另一个是viewDidLoad
。问题 两种选择都是你应该保护addChildViewController:
调用以确保视图控制器未实例化两次。
答案 0 :(得分:1)
不,如果您不想要,则无需在自定义容器视图控制器的viewDidLoad
中实例化所有子项。如果你愿意,你可以,但你不需要。如果您愿意,可以以实时方式实例化它们。
您不仅需要在transitionFromViewController
之前进行实例化,而且还要在addChildController
之前进行实例化。
如果您选择预先实例化所有视图控制器,那么各个控制器创建的成员对象是您在这些控制器中处理它的方式的函数,因此不可能在摘要中回答这些问题。但这可能是学术性的,因为你知道你不必一次性地实例化所有潜在的孩子。
transitionFromViewController
不会影响控制器消耗的内存。控制器的实例化(并将其添加到addChildViewController
)以及随后的removeFromParentViewController
(假设这是您对控制器的最后一个强引用)可以与{一起执行{1}}。