从 C++ 的角度来看:
我听说当你有一个子类时,你应该在子类的 init 中使用相同的 init 函数来初始化超类。我的意思是子类的init应该调用[super init],而子类的initWithFrame应该调用[super initWithFrame]。
这不是真的。这只是常见的。您可以自由调用任何记录为有效初始化程序的超类初始化程序。
像这样查看它可能会有所帮助:查看超类的初始化程序并确定哪些是受支持的。
- 有时有一个指定的初始化器
- 有时会有新的初始化程序(例如,可能会向超超类添加参数的初始化程序)
- 有时有从超超类继承的初始化程序
对于指定的初始化器:认为它受保护
对于新的初始化程序:认为它受保护
对于继承的初始化程序:通常在超类声明新初始化程序时考虑私有,否则受保护
为什么从子类的 initWithFrame 调用 super 的 init 会导致无限循环?
这就是调用不应调用的初始化程序的效果(未定义的行为)。
如果这是必需的,那么这是否意味着我不能在诸如 initWithPoint 的子类中创建一个新的 init 函数,并且仅仅因为超类没有 initWithPoint 就可以调用 super 的 init 或 initWithFrame?
只要您通过支持的超类初始值设定项之一进行调用,就可以了。
我想这里问题的核心就是为什么调用不同的超类是不合适的,这可能让我感到困惑,可能是因为我的 c++ 背景?
objc 不支持初始化程序的隐藏/可见性。一旦它在超类的接口中,它就在那里(并且您可以在编译器无法帮助您的情况下做出错误的选择) - 您应该确定初始化程序的可见性图并相应地编写您的子类。objc 缺少您习惯于在 c++ 中具有的语言功能。