2012-03-15 42 views
12

我一直在宗教上做了几年。检查的self有效性调用[super init...]方法后:为什么我们都在init方法中检查if(self)?

self = [super init]; 
if (self != nil) { 
    // initialize 
} 
return self; 

您可以通过多种方式做到这一点,因为好听this question总结了,但问题是关于语法,我的是这个概念。

我最近从一个学习Objective-C的同事那里得到了一个问题,他问我“为什么我应该测试自己的存在,是不是很明显它在那里?我的简短回答是“错,是的,有些情况下可能会失败,所以这就是原因。”但漫长的回答是,我真的不明白为什么我们在任何地方进行测试,当它发生失败的情况非常罕见。 Apple's reference guide告诉我们一些特定的情况,例如初始化文件或处理单例时。但这些听起来像是[super init] s应该正常工作的规则的非常罕见的例外。

所以我对你的问题是这样的:为什么我们总是测试自我的有效性?我们是否只是在所有地方实施它,以便在发生这种情况时捕捉到这种异常?为什么不跳过整个if (self)的事情,并初始化我们的对象,如果它成功的机会是100%(或从未如此)?

P.S.我意识到这个问题必须是一个愚蠢的做法,因为它非常基础,但是我的搜索查询还有很多关于初始化语法的其他问题。杜佩链接表示赞赏,欢呼!

+3

可能重复[在Objective-C中,为什么我应该检查self = \ [super init \]是不是nil?](http://stackoverflow.com/questions/1287950/in-objective-c-why-应该我检查,如果自我超级初始化不是零) – JeremyP 2012-03-15 15:58:39

回答

6

这里的a helpful old article关于这个问题,还包括一些关于初始化的常见误解。我想说的基本思想是,一个特定的类不应该担心它的超类的实现,所以我们总是检查nil在出现错误的情况下。

+1

链接的文章是现货。不幸的是,在这个话题上有很多关于错误的信息,其中包括一些知名的Wil Shipley(虽然Wil已经在底部更正了他在这个主题上的发帖,但我不会链接到它,因为它几乎没有添加任何关于Mike Ash与回答者联系的文章。) – ipmcc 2012-03-15 13:23:05

+0

该文章确实有帮助,回答了我的所有问题,然后回答了一些问题。谢谢@ jtbandes! – epologee 2012-03-15 22:38:37

1

呃...这绝对是一个很好的问题,我希望我已经做到了。 我不是在Objective-C的专家,但我会尽量给我的意见,而不用担心downvoter的:-)

我能感觉到你的无奈,但:

err, yeah, well there's instances where it can fail, so that's why. 

这是一个非常好的回答。 我认为你没有检查自己,但你正在检查超级对象是否正确初始化,对我来说这是一个不同的观点。

我想在任何情况下,检查对象是否已被正确分配和初始化都是很好的做法,特别是在所有伪装内存分配问题中位于C顶部的objective-c中。初始化在'alloc'之后,它应该用变量等初始化分配的对象...

例如,在类似Java的语言中,构造函数的链由编译器定义好并检查,未能构造在稍后使用该对象时,对象将导致空指针错误。通常Java中的对象分配是无错误的,但通常使用的方法必须包含特设的try/catch错误块。因此该检查稍后会在应用程序生命周期中进行。

在objective-c中,您可能会有一个零对象,原因很多,如果没有应用程序崩溃,您可以将消息发送给无效对象。 我必须诚实地说,当直接从NSObject的子类实例化时,我不知道检查nil的效用。但是,如果我在一个框架或者其他人提供的静态库中扩展一个类,我肯定会感到安全,并检查对象的有效性。

相关问题