大多数类中的方法 init 进行了最小化的初始化,因为如果您需要更复杂、更多的 has-a 相关行为,那么您需要使用 initWith 方法。那么为什么有人会从 init 方法中调用 initWith 呢?我见过这个,甚至在苹果的网站上也提到过,但它似乎隐藏了应该明确命名的行为。
问问题
78 次
1 回答
4
对象具有所谓的“指定初始化程序”,它们是(可以有多个)init...
应该完全初始化和配置对象以供使用的方法。
以 aUIView
为例,它的指定初始化器是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:
指定初始化程序的原因。
于 2018-05-16T17:21:08.827 回答