24

假设我正在用 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()?

4

3 回答 3

27

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

[self release];
self = nil;

请参阅Objective-C 编程指南中的概念中的Initializers 问题。

于 2010-01-06T22:31:50.803 回答
3

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

关联

于 2010-01-06T22:33:44.560 回答
1

我刚试过。-dealloc由于被调用[self release],所以myObject不需要被释放initWithSomeObject。可以肯定的是,您可能会在可能失败的调用下方(如果可能的话)移动myObject = [someObject retain];(我更喜欢这种风格,以防-retain由于某种原因可能会失败)。

于 2010-01-06T23:03:19.383 回答