gpt4 book ai didi

objective-c - [super init]返回nil怎么办?

转载 作者:太空狗 更新时间:2023-10-30 03:46:51 24 4
gpt4 key购买 nike

以下面的代码为例

- (id)init {
self = [super init];
if (self) {
// code
}
return self;
}

我不希望 nil 在调用层次结构中向上传播。我最初的想法是在 self 为 nil 的情况下抛出异常,创建一个还原点并中止执行。

更好的想法?

最佳答案

NSObject 的 [super init] 实现永远不会返回 nil。 The base implementation just returns self .

一般来说,初始化器返回 nil 的唯一原因是发生了非 fatal error 。例如,您可能调用了 -initWithContentsOfURL:error: 并传递了一个无效的 URL。按照惯例,可能以这种方式失败的方法有一个 error: 参数,其中包含有关失败的信息。大多数初始化器没有可恢复错误的可能性,所以像 NSObject 一样,它们永远不会返回 nil。

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

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

最后,初始化器不是检查父类(super class)初始化器失败的正确位置。如果可能出现可恢复的错误,调用者应检查错误。

例子:

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

每当你初始化一个对象时检查 nil 是多余的。仅当存在 error: 参数或方法有记录的可恢复错误时才需要执行此操作。

关于objective-c - [super init]返回nil怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19070970/

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