大多数类中的init方法执行最小化初始化,因为如果需要更多复杂性,更多具有相关行为,则需要使用initWith方法。那么为什么有人会在init方法中调用initWith呢?我已经看到了这一点,它甚至在Apple的网站上提到过,但似乎隐藏了应该明确命名的行为。
答案 0 :(得分:4)
对象具有所谓的“指定初始值设定项”,它们(可能有多个)应该完全初始化和配置对象以供使用的init...
方法。
以UIView
为例,指定初始化程序为initWithFrame:CGRect
。这用框架(duh)初始化视图。
如果init
是指定的初始化程序,则仍需要定义一个框架,可能是CGRectZero
,initWithFrame:
必须调用init
然后{{1 },这意味着设置两次框架。当他们可以做一次时,我们不喜欢做两次。
这就是为什么在许多情况下setFrame:
被用作快捷方式,而其他初始值设定项中的属性可以具有默认值,通常是某种零。在init
的情况下,CGRect
是零值。
此外,由于CGRectZero
是frame
的重要属性,如果您指定的初始化程序为UIView
,您会看到很多这样的内容:
init
将这两行合并为一条是有道理的,这就是为什么UIView *view = [[UIView alloc] init];
view.frame = CGRectMake(0, 0, 20, 20)
是指定的初始值。