调用 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
),由于您 addSubview
到 self.view
,因此它将由 self
保留 (viewController).该视图仍然存在,尽管其 VC 已经 nil
。
所以addChildViewController
让self
(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];
我是 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
),由于您 addSubview
到 self.view
,因此它将由 self
保留 (viewController).该视图仍然存在,尽管其 VC 已经 nil
。
所以addChildViewController
让self
(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];