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

- (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()?

最佳答案

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

[self release];
self = nil;

请参阅《 Objective-C编程概念》中的Issues with Initializers

10-07 19:56
查看更多