通过阅读Apple Tips and Techniques for Framework Developers上的文档,我发现了有关指定初始化程序的声明:
指定的初始值设定项是调用a的类的init方法 超类的
init
方法。 (其他初始值设定项调用init
由类定义的方法。)每个公共类都应该有一个或 更多指定的初始化程序。
(强调补充。)
根据我的理解 - 事实上,“指定”一词的使用 - 一个类应该只有一个指定的初始化器。但根据文档,可以接受多个指定的初始化程序。
假设您有两个(或更多)指定的初始值设定项,它们的作用是调用超类的指定初始值设定项,以保证正确的对象初始化。但是如果两个指定的初始值设定项都在调用同一个超类的指定初始化程序,那么为什么首先需要多个指定的初始化程序呢?是否应该重构该类以将所有其他init
方法汇集到单个指定的初始值设定项中?
关于什么用例或设计模式会调用多个指定的初始化器,我有点困惑?
答案 0 :(得分:6)
如果要对同一个类的不同对象进行不同的初始化,则可以执行此操作。一个例子是类集群,如NSNumber。它有很多初始化器,可以容纳不同类型的数字。为了提供最准确的表示,类应该以它接收到的格式保存其值,而不是强制转换。这意味着初始化程序不能简单地调用公共初始化程序并返回。他们需要做一些定制工作。这使它们成为指定的初始化器。
另一个例子是一个文档类,它只需要对新文件进行一些初始化,而只对正在打开的文档进行一些其他初始化。这两个初始化程序都会调用它们的超级实现,而超级实现又调用普通的init
方法来进行常见的初始化。但是,由于它们不仅仅是调用另一个具有默认值的初始值设定项,因此它们被视为指定的初始值设定项。