【问题标题】:Must you override init when you create a new designated initializer?创建新的指定初始化程序时必须重写 init 吗?
【发布时间】:2015-11-05 13:02:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 只是作为评论添加。我认为我提到的编码器创建他们自己的指定初始化程序并且没有在类中覆盖 init 的原因是因为他们的自定义指定初始化程序只是通过调用 super 来调用 NSObject 的 init,因此那个特定的 init 没有做太多所以他们放手了。只是我现在的看法。
  • 我认为以上是一个坏主意。我已经查阅了 Matt Neuberg 的 iOS 7 Programming Fundamentals 书,并在 pg 上“在其中”。 107 他说'定义指定初始化程序的类还应该覆盖继承的指定初始化程序(在本例中为 init)。你会明白为什么:如果我们不这样做,有人可能会说 [[Dog alloc] init]... 并创建一个没有数字的狗——这正是我们的初始化程序试图阻止的事情。

标签: objective-c designated-initializer


【解决方案1】:

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

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

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

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

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

这里很好地解释了它的工作原理:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2021-11-18
    • 2018-05-16
    相关资源
    最近更新 更多