Objective-C:最小init与init调用initWith?

时间:2018-05-16 16:53:21

标签: objective-c designated-initializer

大多数类中的init方法执行最小化初始化,因为如果需要更多复杂性,更多具有相关行为,则需要使用initWith方法。那么为什么有人会在init方法中调用initWith呢?我已经看到了这一点,它甚至在Apple的网站上提到过,但似乎隐藏了应该明确命名的行为。

1 个答案:

答案 0 :(得分:4)

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

UIView为例,指定初始化程序为initWithFrame:CGRect。这用框架(duh)初始化视图。

如果init是指定的初始化程序,则仍需要定义一个框架,可能是CGRectZeroinitWithFrame:必须调用init然后{{1 },这意味着设置两次框架。当他们可以做一次时,我们不喜欢做两次。

这就是为什么在许多情况下setFrame:被用作快捷方式,而其他初始值设定项中的属性可以具有默认值,通常是某种零。在init的情况下,CGRect是零值。

此外,由于CGRectZeroframe的重要属性,如果您指定的初始化程序为UIView,您会看到很多这样的内容:

init

将这两行合并为一条是有道理的,这就是为什么UIView *view = [[UIView alloc] init]; view.frame = CGRectMake(0, 0, 20, 20) 是指定的初始值。