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

Rob*_*nes 24 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Rob*_*ier 26

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

[self release];
self = nil;
Run Code Online (Sandbox Code Playgroud)

请参阅Objective-C编程指南中的概念中的初始化器问题.