什么时候一个类会有多个指定的初始化器?

Posted

技术标签:

【中文标题】什么时候一个类会有多个指定的初始化器?【英文标题】:When would a class ever have more than one designated initializer? 【发布时间】:2011-09-21 14:56:18 【问题描述】:

通过阅读 Apple 在 Tips and Techniques for Framework Developers 上的文档,我发现了这个关于指定初始化器的声明:

指定的初始化器是一个类的 init 方法,它调用一个 init 超类的方法。 (其他初始化程序调用init 类定义的方法。)每个公共类都应该有一个或 更多指定的初始化器。

(已添加重点。)

根据我的理解——事实上,“指定”这个词的用法——一个类应该只有一个指定的初始化器。但是根据文档,多个指定的初始化器是可以接受的。

假设您有两个(或更多)指定初始化器,它们的作用是调用超类的指定初始化器以保证正确的对象初始化。但是如果两个指定初始化器都调用同一个超类的指定初始化器,那么为什么一开始就需要多个呢?难道不应该重构该类以将所有其他 init 方法集中到单个指定的初始值设定项吗?

我只是有点困惑,什么用例或设计模式需要多个指定的初始值设定项?

【问题讨论】:

有时每个初始值设定项的参数差异太大,无法汇集到相同的“指定”初始值设定项中。建议您让具有最少参数的初始化程序调用具有最多参数的单个初始化程序,但这并不总是有意义的。 即使在你的类可能有参数差异很大的初始化器的情况下,不应该只有一个初始化器负责调用超类的指定初始化器吗?另一个不应该调整它的参数并因此在内部调用指定的初始化程序吗? 【参考方案1】:

当你想对同一个类的不同对象进行不同的初始化时,你会这样做。一个例子是类集群,比如 NSNumber。它有相当多的初始化器,用于它们可以容纳的不同类型的数字。为了提供最准确的表示,类应该以接收它的相同格式保存它的值,而不是强制转换。这意味着初始化器不能简单地调用一个通用的初始化器并返回。他们需要做一些定制工作。这使它们成为指定的初始化器。

另一个例子是一个文档类,它只需要对新文件进行一些初始化,而只对正在打开的文档进行一些其他初始化。这两个初始化器都会调用它们的超级实现,而后者又会调用普通的init 方法来进行通用初始化。但是,由于它们不仅仅是简单地使用默认值调用另一个初始化器,因此它们被视为指定初始化器。

【讨论】:

感谢您的澄清。 一个很好的例子是UIViewinitWithFrame:initWithCoder:。如果您以编程方式实例化它,则需要前者。如果您是从存档加载,则为后者。子类应在适当的情况下调用其中之一(或等效的 = 将调用其中之一的东西)。

以上是关于什么时候一个类会有多个指定的初始化器?的主要内容,如果未能解决你的问题,请参考以下文章

类加载器与反射

在堆中使用指定的初始化器

`UIImage` 类的指定初始化器是啥?

如果没有定义命名空间,一个类会有啥命名空间

急!!NVIDIA安装程序失败

为什么阿里巴巴建议集合初始化时,指定集合容量大小?