UIViewController - alloc和init vs. instantiate?

时间:2014-08-19 09:11:12

标签: ios objective-c uiviewcontroller storyboard

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

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

VS

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

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

2 个答案:

答案 0 :(得分:4)

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

instantiateViewControllerWithIdentifier:创建一个新的视图控制器(如果故事板中存在标识符),并根据视图控制器在Storyboard文件中配置对象的方式进行配置。

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


如果您已在故事板中配置了视图控制器(例如连接的插座,操作等)并且您想要检索它,则应从故事板中读取它。如果您要创建一个新实例(而不是从Storyboard中创建),则不会进行此配置。

答案 1 :(得分:0)

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

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

另一方面,使用指定的标识符在storyboard中查找场景,实例化在该场景的自定义类中指定的视图控制器的新实例,并连接所有插座(例如视图插座)。