什么时候课程会有多个指定的初始化程序?

CIF*_*ter 8 cocoa cocoa-touch initializer cocoa-design-patterns ios

通过Apple 关于框架开发人员的技巧和技巧的文档阅读,我发现了关于指定初始化器的声明:

指定的初始值设定项是调用init超类方法的类的init方法 .(其他初始值设定项调用init 类定义的方法.)每个公共类都应该有一个或多个指定的初始值设定项.

(重点补充.)

基于我的理解 - 实际上,"指定"一词的使用 - 一个类应该只有一个指定的初始化器.但根据文档,可以接受多个指定的初始化程序.

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

关于什么用例或设计模式会调用多个指定的初始化器,我有点困惑?

ugh*_*fhw 6

如果要对同一个类的不同对象进行不同的初始化,则可以执行此操作.一个例子是类集群,如NSNumber.它有很多初始化器,可以容纳不同类型的数字.为了提供最准确的表示,类应该以它接收的格式保持其值,而不是强制转换.这意味着初始化程序不能简单地调用公共初始化程序并返回.他们需要做一些定制工作.这使它们成为指定的初始化器.

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

  • 一个很好的例子是`UIView`的`initWithFrame:`和`initWithCoder:`.如果您以编程方式实例化它,则需要前者.如果您从存档加载,则后者.子类应该在适当的情况下调用其中一个(或等效的=将调用其中一个的东西). (4认同)