3

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

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

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

其次,如果您不使用这个宏,那么在调用指定的初始化程序时不显式覆盖 init 可能意味着什么?我意识到编译器不知道哪个是指定的初始化程序,所以这会不会有什么不好的事情发生,当你为你的类创建一个新的指定初始化程序时,重写 init 是否只是一种好习惯?

编辑:我只想进一步澄清这个问题。我见过一些优秀的程序员没有添加不同的方法来覆盖 init 的例子,尽管他们添加了他们自己制作的指定初始化程序。当我问你是否应该重写 init 时,我的意思是除了创建你自己的特定指定初始化程序之外,它当然应该调用它的超类的 init 方法。我见过一个好的程序员不这样做,所以我想知道你为什么要这样做。

4

1 回答 1

3

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

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

便利初始化程序缺少对另一个初始化程序的“自我”调用。

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

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

这是一个很好的解释它是如何工作的:

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

于 2015-11-05T14:19:00.870 回答