【发布时间】:2018-05-16 16:53:21
【问题描述】:
大多数类中的方法 init 进行了最小化的初始化,因为如果您需要更复杂、更多的 has-a 相关行为,那么您需要使用 initWith 方法。那么为什么有人会从 init 方法中调用 initWith 呢?我见过这个,甚至在苹果的网站上也提到过,但它似乎隐藏了应该明确命名的行为。
【问题讨论】:
标签: objective-c designated-initializer
大多数类中的方法 init 进行了最小化的初始化,因为如果您需要更复杂、更多的 has-a 相关行为,那么您需要使用 initWith 方法。那么为什么有人会从 init 方法中调用 initWith 呢?我见过这个,甚至在苹果的网站上也提到过,但它似乎隐藏了应该明确命名的行为。
【问题讨论】:
标签: objective-c designated-initializer
对象具有所谓的“指定初始化程序”,它们是(可以有多个)init... 方法,应该完全初始化和配置对象以供使用。
以UIView 为例,它指定的初始化器是initWithFrame:CGRect。这会用框架初始化视图(duh)。
如果init 是指定的初始化器,它仍然必须定义一个框架,可能是CGRectZero,而initWithFrame: 必须调用init,然后是setFrame:,这意味着设置框架两次。我们不喜欢可以做两次的事情。
这就是为什么在许多情况下init 被用作当其他初始化程序中的属性可以具有默认值(通常是某种零)时的快捷方式。在CGRect 的情况下,CGRectZero 是零值。
另外,由于frame 是UIView 的一个重要属性,如果您指定的初始化程序是init,您会看到很多这样的:
UIView *view = [[UIView alloc] init];
view.frame = CGRectMake(0, 0, 20, 20)
将这两行合二为一很有意义,这就是为什么initWithFrame: 是指定的初始化器。
【讨论】:
[[UIView alloc] init],它肯定会初始化frame。
-[UIView init] 像往常一样调用-[UIView initWithFrame:CGRectZero]。我们缺少什么吗? init 不做“最小初始化”。它确实完成了初始化(所有init 方法都可以)。它只是提供了更多的默认值。