创建新的指定初始化程序时必须覆盖 init 吗?

Must you override init when you create a new designated initializer?

我在 objective-c 中阅读了很多关于指定初始化器和便利初始化器的内容,感觉我对它们的使用方式和使用原因有了很好的理解。我只有几个悬而未决的问题,真的是一个。

假设您有一个直接从 NSObject 继承的 class,并且您为它创建了一个指定的初始化程序。

我知道你现在可以使用 NS_DESIGNATED_INITIALIZER 标记你的指定初始化器,但我想知道这是否意味着它迫使你在同一个 class, 首先通过调用指定的初始化器来覆盖 init?

其次,如果您不使用这个宏,那么不通过调用指定的初始化程序显式覆盖 init 可能意味着什么?我意识到编译器不知道哪个是指定的初始化程序,所以这可能会带来任何不好的结果,当您为 class 创建新的指定初始化程序时,是否也重写 init 只是一种好习惯?

编辑:我只想进一步说明这个问题。我见过优秀编码人员的示例,尽管他们添加了自己制作的指定初始化程序,但没有添加不同的方法来覆盖 init。 当我问你是否应该覆盖 init 时,我的意思是 除了 创建你自己的特定指定初始化程序,当然应该调用其 superclass 的 init 方法。我见过一个优秀的编码员不这样做,所以我想知道为什么你会这样做。

您现在可以使用 NS_DESIGNATED_INITIALIZER 标记您的指定初始化程序,但我想知道这是否意味着它会强制您在同一个 class 中分别强制您首先使用调用指定的初始化程序?

在 self 中调用任何初始化程序将绕过警告。当我尝试调用 super.init 方法时,我收到以下警告。

Convenience initializer missing a 'self' call to another initializer.

不通过调用指定的初始化程序显式覆盖 init 可能意味着什么?

这意味着您的对象可能缺少运行所需的一些重要信息,或者应用假定该对象始终具有,如果没有,则可能会导致错误或崩溃应用程序。

这里很好地解释了它是如何工作的:

http://timekl.com/blog/2014/12/09/objective-cs-designated-secret/