gpt4 book ai didi

objective-c - 非指定初始化器可以调用 super 的指定初始化器吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:14 26 4
gpt4 key购买 nike

可以做到以下几点吗?

1) 非指定构造器调用父类(super class)的指定构造器
2) 类的指定构造器调用父类(super class)的非指定构造器?

或者流程必须是:

a) 指定构造器必须调用父类(super class)的指定构造器
b) 非指定构造器必须调用自己类的指定构造器

如果违反了上述 (1) 或 (2),会发生什么情况? (或者,如果我们必须始终遵循(a)和(b),其背后的原因是什么?)

最佳答案

  • 1:没有。
  • 2:是的。
  • a:有争议。
  • b:是的。

指定初始化程序的要点在于,它是知道如何正确设置手头对象的初始化程序。该类中的所有其他初始化程序都应调用指定的初始化程序;否则,对象可能无法正确初始化。

Apple 的 Cocoa 文档讨论了 how to handle multiple initializers , 它包括以下内容:

The initializer of a class that takes the full complement of initialization parameters is usually the designated initializer. The designated initializer of a subclass must invoke the designated initializer of its superclass by sending a message to super.

这有点模棱两可——听起来子类的指定构造器必须调用其父类(super class)的指定构造器。但我认为这不是真正的意图。这里的真正要点是,指定初始化器有责任通过向 super 发送消息来确保父类(super class)被正确初始化。如果您碰巧通过调用 super 的非指定初始化器之一来做到这一点,那么只要该初始化器最终导致指定初始化器被调用,那应该没问题。因此,我认为 (2) 不是问题。

进一步阅读我们有:

The convenience (or secondary) initializers—which can include init—do not call super.

所以他们在这里说的是,指定初始化器和任何其他初始化器之间的一个重要区别是指定初始化器是唯一一个向 super 发送初始化消息的初始化器。

回到 (1),如果您有一个调用 [super init] 的“非指定”初始化程序,那么它并不是真正的非指定初始化程序。您的方法通过向 super 发送初始化消息来承担指定初始化程序的责任。这不一定是个问题——请注意 UIView 有两个指定的初始化器——但它打破了通常的约定,所以你应该有充分的理由这样做。

关于objective-c - 非指定初始化器可以调用 super 的指定初始化器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12559032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com