【问题标题】:What happens to alloc if initWithX fails?如果 initWithX 失败,alloc 会发生什么?
【发布时间】:2011-03-25 16:42:09
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您要降级,请添加原因。如果我不知道错误是什么,我将如何理解问题?

标签: objective-c init alloc


【解决方案1】:

如果由于任何原因初始化失败,你应该释放 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 在 cmets 中指出的那样,请查看分配和初始化对象的 Handling Initialization Failure 部分。

【讨论】:

【解决方案2】:

基本上,this 会回答您的问题。

处理初始化失败

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

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

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

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2016-01-23
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多