可能重复:
In Objective-C why should I check if self = [super init] is not nil?
我经常看到这个“if(self = [super init])”构造,我想知道它为什么会这样做。
- (id) init {
if (self = [super init]) {
// how could self = [super init]; ever fail?
}
return self;
}
答案 0 :(得分:5)
想象一下你的超类做到了这一点:
- (id)init {
self = [super init];
if (self) {
self->foo = CreateExpensiveWidgetOverTheInternetByTrain();
if (!self->foo) {
// widget creation failed, bail out
[self release];
self = nil;
}
}
return self;
}
就是这样。 ;)
答案 1 :(得分:1)
[super init]
可能有多种失败方式:
您正在尝试子类化“final
”类,即专门设计为不允许子类化的类。
你失去了记忆,运气不好。
在initWithArgument:parameter:
的情况下;你提供了无效的参数或参数。
另外,其他不太明显的方法;这通常是最危险的。
答案 2 :(得分:0)
通常,如果在初始化方法期间出现问题,您应该在
release
上调用self
方法并返回nil
。此政策有两个主要后果:
- 从初始化方法接收
nil
的任何对象(无论是您自己的类,子类还是外部调用者)都应该能够处理它。如果调用者在调用之前已经建立了对该对象的任何外部引用,则必须撤消任何连接。- 在存在部分初始化对象的情况下,您必须确保
dealloc
方法是安全的。