我应该如何处理Objective-C中init:方法的失败?

时间:2010-01-06 22:27:59

标签: iphone objective-c cocoa-design-patterns

假设我在Objective-C中为iPhone构建一个新类。在我的一个init方法中,我想手动分配一些内存。所以,我可能会有这样的事情:

- (id)initWithSomeObject:(SomeObject *)someObject {
  self = [super init];
  if (self != nil) {
    myObject = someObject;
    [myObject retain];
    if ( (memory = calloc(1, sizeof(SomeStruct)) == NULL) {
      // What should I do here to clean up
      [self release];
      self = nil;
    }
  }
  return self;
}

现在,假设calloc()可能失败,并且无法分配内存对我的对象来说是灾难性的,我应该在if-body内做什么来正确清理?是否存在我应该使用的Objective-C习语或模式?

编辑:我收录了Rob Napier发布的代码。但是,我还是要释放myObject,对吧?或者添加的代码是否以某种方式触发dealloc()?

3 个答案:

答案 0 :(得分:26)

是的,您应该释放自己,然后返回nil

[self release];
self = nil;

请参阅Objective-C编程概念指南中的Issues with Initializers

答案 1 :(得分:3)

您需要清理所需的任何内容,然后将自引用设置为nil。 Apple Dev Portal有一篇文章:

Link

答案 2 :(得分:1)

我刚试过。 -dealloc[self release]而被调用myObject,因此initWithSomeObject无法在myObject = [someObject retain];中释放-retain。可以肯定的是,您可能会在可能失败的调用(如果可能的话)之下移动{{1}}(我希望{{1}}可能因某种原因失败的风格)。

相关问题