如果initWithX失败,alloc会发生什么?

时间:2011-03-25 16:42:09

标签: objective-c init alloc

通常的做法是在Objective-C中编写MyClass* obj = [[MyClass alloc] initWithX:X]initWithX通常定义为

- (MyClass*) initWithX: (MyArgClass*) X {
    if (self = [super init])  {
        // initialize
    }
    return self;
} 

我的问题是:如果初始化失败怎么办?我不想抛出异常,但是,我如何指出错误?如果我返回nil,则调用者将无法释放指针。

2 个答案:

答案 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方法是安全的。
  •   
     

...