Objective c 为什么我们都要在init方法中检查if(self)?

Objective c 为什么我们都要在init方法中检查if(self)?,objective-c,cocoa-touch,cocoa,initialization,Objective C,Cocoa Touch,Cocoa,Initialization,我已经虔诚地做了几年了。调用[super init…]方法后检查self的有效性: self = [super init]; if (self != nil) { // initialize } return self; 你可以用多种方式来做这件事,正如很好的总结,但这个问题是关于语法的,我的问题是关于概念的 最近,我收到一位正在学习Objective-C的同事的一个问题,他问我“为什么我要测试自我的存在,它是否明显存在?”我的简短回答是“呃,是的,它可能会失败,这就是原因。”但很长一

我已经虔诚地做了几年了。调用
[super init…]
方法后检查
self
的有效性:

self = [super init];
if (self != nil) {
    // initialize
}
return self;
你可以用多种方式来做这件事,正如很好的总结,但这个问题是关于语法的,我的问题是关于概念的

最近,我收到一位正在学习Objective-C的同事的一个问题,他问我“为什么我要测试自我的存在,它是否明显存在?”我的简短回答是“呃,是的,它可能会失败,这就是原因。”但很长一段时间的答案是,我真的不明白为什么我们到处测试它,而失败的例子却非常罕见。告诉我们一些具体的情况,比如在初始化文件或处理单例时。但是,对于
[super init]
s应该正常工作的规则来说,这些听起来像是非常罕见的例外

所以我的问题是:为什么我们总是测试自我的有效性?我们只是在任何地方实施它,以便在发生异常的地方抓住它?为什么不跳过整个
if(self)
事件,并在对象成功的概率为100%时初始化它呢(或者从来都不是这样)


另外,我意识到这个问题一定是个骗局,因为它太基本了,但我的搜索查询还有很多关于初始化语法的问题。感谢复制链接,干杯

这里是关于这个主题的,还包括一些关于初始值设定项的常见误解。我想说的基本思想是,一个特定的类不应该关心它的超类的实现,所以我们总是检查
nil
,以防出现错误。

嗯……这绝对是一个好问题,我希望我已经做了。 我不是objective-c方面的专家,但我会尽量给出我的意见,而不必担心被否决:——)

我能感觉到你的沮丧,但是:

err, yeah, well there's instances where it can fail, so that's why.
这是一个非常好的答案。 我认为你不是在检查self,而是在检查超级对象是否正确初始化,对我来说,这是一个不同的观点

我认为在任何情况下,检查对象是否已正确分配和初始化总是一种好的做法,特别是在objective-c中,它位于c之上,存在所有伪装内存分配问题。Init在“alloc”之后,它应该用变量等初始化分配的对象

例如,在像Java这样的语言中,编译器很好地定义并检查构造函数链,如果未能构造对象,将导致在以后使用该对象时出现空指针错误。Java中的对象分配通常是无错误的,但方法的使用通常必须被特殊的try/catch错误块包围。因此,检查将在应用程序生命周期的后期进行

相反,在objective-c中,由于许多原因,您可能会有一个nil对象,若并没有应用程序崩溃,您可能会结束向无效对象发送消息的过程。
老实说,当直接从NSObject的子类实例化时,我不知道检查nil的实用性。但是,如果我在一个框架中扩展一个类,或者在其他人提供的静态库中扩展一个类,我肯定会觉得检查对象的有效性是安全的。

这篇链接文章很贴切。不幸的是,在这个主题上有很多错误的信息,包括一些著名的名人Wil Shipley(尽管Wil已经更正了他在底部关于这个主题的帖子。我不会链接到它,因为它对Mike Ash由回答者链接的文章几乎没有任何补充。)这篇文章确实很有帮助,回答我所有的问题,然后回答一些。谢谢@jtbandes!可能重复的