0

大多数类中的方法 init 进行了最小化的初始化,因为如果您需要更复杂、更多的 has-a 相关行为,那么您需要使用 initWith 方法。那么为什么有人会从 init 方法中调用 initWith 呢?我见过这个,甚至在苹果的网站上也提到过,但它似乎隐藏了应该明确命名的行为。

4

1 回答 1

4

对象具有所谓的“指定初始化程序”,它们是(可以有多个)init...应该完全初始化和配置对象以供使用的方法。

以 aUIView为例,它的指定初始化器是initWithFrame:CGRect. 这将使用框架初始化视图(duh)。

如果init是指定的初始化器,它仍然必须定义一个框架,可能CGRectZero,并且initWithFrame:必须调用init然后setFrame:,这意味着设置框架两次。当事情可以做一次时,我们不喜欢做两次。

这就是为什么在许多情况下init,当其他初始化程序中的属性可以具有默认值(通常是某种零)时,它被用作快捷方式。在 的情况下CGRectCGRectZero是零值。

此外,由于frame是 的一个重要属性UIView,如果您指定的初始化程序是init,您会看到很多这样的:

UIView *view = [[UIView alloc] init];
view.frame = CGRectMake(0, 0, 20, 20)

将这两行合二为一是有意义的,这就是initWithFrame:指定初始化程序的原因。

于 2018-05-16T17:21:08.827 回答