コンビニエンスコンストラクタ

コンビニエンスコンストラクタがいまいち理解しにくいので、現時点での理解をまとめてみる。

  • コンビニエンスコンストラクタは、クラスの(一時的な)インスタンス(実体)を生成して初期化する
  • イニシャライザはインスタンスの生成は行わない
  • 一時的なインスタンスは自動開放プールがreleaseされたら消滅するため、必要に応じてretainする

だから、クラスのインスタンス変数はallocしてから指定イニシャライザを呼ぶか、コンビニエンスコンストラクタを呼んでインスタンスを生成するかしないといけない。
実体のないインスタンス変数からいきなり指定イニシャライザを呼ぶのはもってのほか。

/* Testクラスのコンビニエンスコンストラクタ */
+ (id)testWithA:(int)a{
  id s = [[self alloc] initWithA:a];
  return [s autorelease];
}

/* 指定イニシャライザ */
- (id)initWithA:(int)a{
  if((self == [super init] != nil){
    /* 初期化処理 */
  }
  return self;
}