1

MyClass* obj = [[MyClass alloc] initWithX:X]用 Objective-C编写是一种常见的做法。initWithX通常定义为

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

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

4

2 回答 2

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 在评论中指出的那样,请查看分配和初始化对象的处理初始化失败部分。

于 2011-03-25T16:52:25.933 回答
1

基本上,回答了你的问题。

处理初始化失败

一般来说,如果在初始化方法的过程中出现问题,应该调用该release方法self并返回nil

这项政策有两个主要后果:

  • 从初始化方法接收的任何对象(无论是您自己的类、子类还是外部调用者)nil都应该能够处理它。如果调用者在调用之前已经建立了对该对象的任何外部引用,那么您必须撤消任何连接。
  • 您必须确保dealloc在存在部分初始化的对象时方法是安全的。

...

于 2011-03-25T17:04:49.930 回答