作为从 [[class alloc] init] 返回 nil 被认为是好的做法?,有一种情况我没有看到太多讨论:如何处理一个在调用下一个 init 之前失败了一些先决条件的 init?
例如,假设在这个 initWithStuff: 方法中被传递 nil 或者通常没有值传递给 initWithValue: 是绝对失败的,我们肯定想要返回 nil。
- (id)initWithStuff:(Stuff *)inStuff {
if (!inStuff || ![inStuff hasValidValue])
{
// can't proceed to call initWithValue: because we have no value
// so do what?
return nil;
}
NSInteger value = [inStuff integerValue];
return [super initWithValue:value];
}
也许一个更清楚的例子是,如果我们包装的指定初始化方法接受一个对象指针,如果它传递 nil 则抛出异常。我们肯定需要短路会导致异常的初始化调用。
我的猜测:以任何可能的方式初始化,然后才在返回零之前释放自我。如有必要,请调用裸 init 或任何其他初始化程序,以在释放它之前完成将 self 置于已知状态。
// can't proceed to call super's initWithValue: because we have no value
// so do what? do this:
self = [super init]; // or initWithValue:0
[self release];
return nil;
如果没有这样的初始化程序可以在没有有效数据的情况下工作,我想人们需要构造一些有效的虚拟数据。或者向其作者投诉,然后返回 nil 并忍受泄漏:^)
另外,ARC如何影响这种情况?
我的猜测:仍然以任何可能的方式完成初始化,然后返回 nil。你会认为设置 self 可能是多余的,但在某些情况下并非如此。在任何情况下,它都需要在那里消除编译器警告。
// can't proceed to call super's initWithValue: because we have no value
// so do what? do this:
self = [super init]; // finish init so ARC can release it having no strong references
return nil;
我的猜测有任何错误吗?