如果[super init]返回nil怎么办?

Pét*_*son 5 objective-c

以下面的代码为例

- (id)init {
    self = [super init];
    if (self) {
        // code
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我不希望nil传播调用层次结构.我最初的想法是抛出一个异常,如果self为nil,做一个恢复点并中止执行.

好主意?

Chr*_*eux 9

NSObject的实现[super init]永远不会返回零.基础实现只返回self.

通常,初始化程序返回nil的唯一原因是发生了非致命错误.例如,您可能已经调用-initWithContentsOfURL:error:并传递了无效的URL.按照惯例,可能以这种方式失败的方法具有error:参数,该参数包含有关失败的信息.大多数初始化程序都没有可恢复错误的可能性,因此像NSObject一样,它们永远不会返回nil.

致命错误通常会引发异常或中止程序.因此检查nil对他们没有帮助.处理致命错误的最佳方法是NSSetUncaughtExceptionHandler,尽管您应该知道在发生致命错误的情况下保存数据存在风险,因为未保存的数据可能已损坏.在这种情况下,不要覆盖好的数据.

为什么objective-c代码总是nil在初始化器中检查,即使super永远不会返回nil?公约,主要是.可以说,通过始终检查nil,超类在将来添加失败条件变得更容易,而不需要更改子类,但实际上它只是一个约定.

最后,initalizer不是检查超类初始化程序失败的正确位置.如果可能出现可恢复的错误,则调用者应检查错误.

例:

NSError *error;
FooClass *myFoo = [[FooClass alloc] initWithContentsOfURL:blah error:&error]
if (myFoo == nil) {
  // ...
} else {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

初始化对象时检查nil是否过度.只有在存在error:参数时才需要执行此操作,或者该方法具有记录的可恢复错误.