0

我有 1 个父控制器和 1 个视图控制器。我已经成功地执行了addChildViewControllertransitionFromViewController函数来利用 iPhone SDK 提供的 Containment API。然而,在我真正将视图控制器传递给这些函数之前,我有几个问题

问题 1:在 ParentVCViewDidLoad方法中,我必须使用以下方法实例化所有 4 个子视图控制器

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 会发生什么?

更新:此特定教程中的以下引用似乎涉及我的一些担忧(强调添加):

请注意,这self.storyboard不是通过init电话设置的。目前,还没有放置此初始化代码的好地方。一种选择是覆盖setStoryboard:,另一种是viewDidLoad. 这两个选项的问题是您应该保护addChildViewController: 调用以确保视图控制器不会被实例化两次。

4

1 回答 1

1
  1. 不,如果您不想,您不需要实例化自定义容器视图控制器中的所有子项viewDidLoad。如果你愿意,你可以,但你不必。如果您愿意,可以以即时的方式实例化它们。

  2. 您不仅需要实例化 before transitionFromViewController,而且显然也需要 before addChildController

  3. 如果您选择预先实例化所有视图控制器,则各个控制器创建的成员对象取决于您在这些控制器中如何处理它,因此无法抽象地回答这个问题。但这可能是学术性的,因为您知道您不必一次实例化所有潜在的孩子。

  4. transitionFromViewController不会影响控制器消耗的内存。哪些控件将是控制器的实例化(并将其添加到addChildViewController)以及removeFromParentViewController您可能与transitionFromViewController.

于 2013-01-11T20:30:40.287 回答