gpt4 book ai didi

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

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

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

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

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

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

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

最佳答案

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

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

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

如果不通过调用指定的初始化程序显式覆盖 init,可能会产生什么影响?

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

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

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

关于objective-c - 创建新的指定初始化程序时必须覆盖 init 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33545288/

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