24

Objective-C で iPhone 用の新しいクラスを構築しているとしましょう。init メソッドの 1 つで、手動でメモリを割り当てたいと考えています。だから、私はこのようなものを持っているかもしれません:

- (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 プログラミング ガイドの概念の初期化子に関する問題を参照してください。

于 2010-01-06T22:31:50.803 に答える
3

必要なものをすべてクリーンアップしてから、自己参照をに設定する必要がありますnil。AppleDevPortalには次の記事があります。

リンク

于 2010-01-06T22:33:44.560 に答える
1

試してみました。-deallocは によって呼び出されるため[self release]、 でmyObject解放される必要はありませんinitWithSomeObject。確かに、失敗する可能性のある呼び出しの下に移動する可能性がありますmyObject = [someObject retain];(-retain可能であれば)。

于 2010-01-06T23:03:19.383 に答える