调用 addChildViewController 或不调用 addChildViewController

To call addChildViewController or not to call addChildViewController

我是 Objective-C 和 iOS 的新手,我已经接受了别人编写的应用程序。我注意到一些让我震惊的事情,我认为我的问题与人们询问的有关 addChildViewController 的其他问题略有不同。

好吧,应用程序运行良好。旋转工作正常。一切都很好。 那么问题是什么?

好吧,有一个全屏视图,它以并排平铺类型的布局包含一堆子视图。换句话说,它们都有相同的全屏父视图,并且彼此是兄弟。 这些子视图都是 UIViewController 的一个实例。 我曾期望看到这样设置的子视图...

DoohickeyController *doohickey = [[DoohickeyController alloc] initWithNibName:@"Doohickey" bundle:nil];
[self addChildViewController:doohickey];
[self.view addSubview:doohickey.view];

但他们只是这样做....

DoohickeyController *doohickey = [[DoohickeyController alloc] initWithNibName:@"Doohickey" bundle:nil];
[self.view addSubview:doohickey.view];

当应用程序看起来运行良好时,是否有关于是否调用 addChildViewController 的硬性规定?

有没有advantage/disadvantage来添加对addChildViewController的调用?

我认为原因之一可能是您的 childViewController 的所有权。

如果您在函数中 alloc init 它,它是该函数内部的 自动参数 。而当函数returns时,你的childViewController会自动释放,变成nil.

同时,您的 childViewController 的视图 (doohickey.view),由于您 addSubviewself.view,因此它将由 self 保留 (viewController).该视图仍然存在,尽管其 VC 已经 nil

所以addChildViewControllerself(viewController)保留doohickey(subviewController),因此doohickey和[的所有权=12=]将统一,同时发布(在self发布后)。

UIKit 的主要设计假设之一是 ViewController 层次结构通常与 View 层次结构同步。处理自动旋转和大小 class 转换的回调通过 ViewController 链向下传递,如果您从未在 ViewController 之间创建父子关系,则此系统将崩溃。

我遵循(伪代码)

的模式
//given:
ViewController *a;
ViewController *b;

[a willMoveToViewController:b];
[b addChildViewController:a];
[a didMoveToViewController:b];

[b.view addSubview:a.view];