通常的做法是在Objective-C中编写MyClass* obj = [[MyClass alloc] initWithX:X]
。 initWithX
通常定义为
- (MyClass*) initWithX: (MyArgClass*) X {
if (self = [super init]) {
// initialize
}
return self;
}
我的问题是:如果初始化失败怎么办?我不想抛出异常,但是,我如何指出错误?如果我返回nil
,则调用者将无法释放指针。
答案 0 :(得分:3)
如果由于任何原因导致初始化失败,则应释放self。对于初始化时可能发生的例外情况,您需要根据需要添加@try
@catch
,以便释放self
。
- (MyClass*) initWithX: (MyArgClass*) X {
if (self = [super init]) {
// initialize
if(myInitializationCodeFailed)
{
[self release];
return nil;
}
}
return self;
}
<强>更新强>
如果初始化失败,我不会在初始化代码中引发异常。如果您想向调用者提供信息,我会重构初始化程序以接受要返回的NSError
。
- (MyClass*) initWithX: (MyArgClass*) X error:(NSError**)error {
正如Alexei Sholik在评论中指出的那样,请查看分配和初始化对象的Handling Initialization Failure部分。
答案 1 :(得分:1)
基本上,this会回答您的问题。
处理初始化失败
通常,如果在初始化方法期间出现问题,您应该在
release
上调用self
方法并返回nil
。此政策有两个主要后果:
- 从初始化方法接收
nil
的任何对象(无论是您自己的类,子类还是外部调用者)都应该能够处理它。如果调用者在调用之前已经建立了对该对象的任何外部引用,则必须撤消任何连接。- 在存在部分初始化对象的情况下,您必须确保
dealloc
方法是安全的。...