【问题标题】:UIViewController - alloc and init vs. instantiate?UIViewController - 分配和初始化与实例化?
【发布时间】:2014-08-19 09:11:12
【问题描述】:

以下两种实例化视图控制器的方式有什么区别?

MyViewController *vc = [[MyViewController alloc] init];
// present vc...

对比

[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewControllerScene"]

似乎alloc init 可以神奇地识别故事板中的正确场景;这是怎么发生的?它在后台调用instantiateViewControllerWithIdentifier: 吗?哪个是实例化视图控制器的首选方式?第一种方式会导致内存泄漏或无关的视图控制器实例吗?

【问题讨论】:

  • 你是如何测试这个的?我的测试没有显示从情节提要中实例化的 alloc init。
  • 我用第一种方法推入了一个新的视图控制器,它成功了。
  • 什么是反对票?
  • 我从您接受的答案中看到您的测试有问题。说得通。 (FWIW 我没有否决这个问题,事实上,考虑到你认为你所经历的,我认为这是一个非常好的问题。)

标签: ios objective-c uiviewcontroller storyboard


【解决方案1】:

[[MyObject alloc] init] 创建一个新对象。它不是从情节提要中检索对象,只是为它分配内存并实例化它。

instantiateViewControllerWithIdentifier: 创建一个新的视图控制器(如果标识符存在于情节提要中)并根据情节提要文件中视图控制器的配置对象进行配置。

两种情况都会为每次调用创建一个新实例。


如果您在 Storyboard 中配置了一个视图控制器(例如连接的插座、操作等)并且您想要检索它,您应该从 Storyboard 中读取它。如果您要创建一个新实例(不是从情节提要中),它将没有此配置。

【讨论】:

  • 我明白了。你是对的,第一种方法没有配置我在 Interface Builder 中设置的任何 IBOutlets。因为在我的情况下它是一个表视图控制器,所以我忽略了 IBOutlet 的差异。
【解决方案2】:

[[MyViewController alloc]init] 将实例化 MyViewController 的新实例,但它不会与视图或情节提要中的任何其他元素相关联 - 也就是说,通过 IBOutlets 设置的任何属性都将为零。如果您在视图控制器中以编程方式填充所有 UI,则可以使用此语句。

[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewControllerScene"]

另一方面,在情节提要中使用指定的标识符定位场景,实例化在该场景的自定义类中指定的视图控制器的新实例,并连接所有出口(例如视图出口)。

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 2018-11-26
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多