以下两种实例化视图控制器的方法有什么区别?
MyViewController *vc = [[MyViewController alloc] init];
// present vc...
VS
[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewControllerScene"]
似乎alloc init
可以神奇地识别故事板中的正确场景;这是怎么发生的?是否在引擎盖下调用instantiateViewControllerWithIdentifier:
?哪个是实例化视图控制器的首选方法?第一种方式会导致内存泄漏还是无关的视图控制器实例?
答案 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中查找场景,实例化在该场景的自定义类中指定的视图控制器的新实例,并连接所有插座(例如视图插座)。