以下面代码为例
- (id)init {
self = [super init];
if (self) {
// code
}
return self;
}
我不希望 nil 向上传播调用层次结构。我最初的想法是在 self 为零的情况下抛出异常,创建一个还原点并中止执行。
更好的想法?
NSObject 的实现[super init]
永远不会返回零。基本实现只返回 self.
一般来说,初始化程序返回 nil 的唯一原因是发生非致命错误。例如,您可能已经调用-initWithContentsOfURL:error:
并传递了无效的 URL。按照惯例,可能以这种方式失败的方法有一个error:
参数,其中包含有关故障的信息。大多数初始化器都不可能出现可恢复的错误,因此像 NSObject 一样,它们永远不会返回 nil。
致命错误通常会引发异常或中止程序。所以检查 nil 对他们没有帮助。处理致命错误的最佳选择是NSSetUncaughtExceptionHandler,尽管您应该意识到,在发生致命错误的情况下保存数据是有风险的,因为未保存的数据可能会被损坏。在这种情况下,不要覆盖好的数据。
为什么 Objective-C 代码总是检查nil
在初始化器中,即使 super 永远不会返回 nil?主要是惯例。可以说,通过始终检查 nil,超类将来添加失败条件变得更容易,而无需更改子类,但实际上这只是一个约定。
最后,初始化器不是检查超类初始化器是否失败的正确位置。如果可能出现可恢复的错误,调用者应该检查错误。
Example:
NSError *error;
FooClass *myFoo = [[FooClass alloc] initWithContentsOfURL:blah error:&error]
if (myFoo == nil) {
// ...
} else {
// ...
}
每当初始化一个对象时检查 nil 就太过分了。仅当存在以下情况时才需要执行此操作error:
参数,或者该方法有记录的可恢复错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)