【问题标题】:Why do we need to override superclasses' designated initializer为什么我们需要重写超类的指定初始化器
【发布时间】:2015-05-08 05:48:39
【问题描述】:

在 Aaron Hillegass 的 Objective-C 编程书籍中,他给出了一些编写自定义 init 方法的规则。规则之一是“如果你的类的指定初始化程序与其超类的指定初始化程序不同,你必须重写超类的指定初始化程序,以便它调用(你的新类的)新的指定初始化程序”

为什么这是强制性的。我看到的唯一问题是,您的类中的任何实例变量都将被初始化为 null,直到您使用它们的 setter 显式初始化它们。这有什么问题?

【问题讨论】:

标签: ios objective-c


【解决方案1】:

这是因为一个类的每个初始化器都必须通过该类的指定初始化器,以确保所有常见的设置都发生在一个地方。 即使超类的指定初始化程序也应该通过您的子类的初始化程序,如果您指定它,否则在您指定的初始化程序中发生的设置可能会被天真的客户端调用到不同的初始化程序而错过。

【讨论】:

  • "即使是超类的指定初始化器也应该通过你的子类的初始化器。"你不是想说反话吗?如,子类的指定初始化程序应该通过(调用)其超类的指定初始化程序?
  • 重写超类的指定构造器时,调用子类的构造器,实现子类的指定构造器时单独调用超类的构造器。
【解决方案2】:

因为它确保对象的所有初始化都必须调用您的类指定的初始化程序。如果不覆盖其超类的指定初始化程序,如果当前类(您的自定义类)使用一个超的初始(指定或便利)方法初始化会发生什么?你指定的首字母从未被调用过

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多