2012-01-18 3 views
-1

は、次イニシャライザ Objective-Cイニシャライザを使用するために推奨される方法はどれですか?

- (id)initWithParameterA:(A *)a 
{ 
    return [self initWithParameterA:a parameterB:nil parameterC:nil]; 
} 

- (id)initWithParameterA:(A *)a parameterB:(B *)b 
{ 
    return [self initWithParameterA:a parameterB:b parameterC:nil]; 
} 

- (id)initWithParameterA:(A *)a parameterB:(B *)b parameterC:(C *)c 
{ 
    // Actual initialization logic 
} 

便宜初期化子次の2つの群の好ましい

考えますか? (と仮定すると、ARC。)

グループA

+ (id)objectWithParameterA:(A *)a 
{ 
    return [self objectWithParameterA:a parameterB:nil parameterC:nil]; 
} 

+ (id)objectWithParameterA:(A *)a parameterB:(B *)b 
{ 
    return [self objectWithParameterA:a parameterB:b parameterC:nil]; 
} 

+ (id)objectWithParameterA:(A *)a parameterB:(B *)b parameterC:(C *)c 
{ 
    return [[self alloc] initWithParameterA:a parameterB:b parameterC:c]; 
} 

グループB

+ (id)objectWithParameterA:(A *)a 
{ 
    return [[self alloc] initWithParameterA:a parameterB:nil parameterC:nil]; 
} 

+ (id)objectWithParameterA:(A *)a parameterB:(B *)b 
{ 
    return [[self alloc] initWithParameterA:a parameterB:b parameterC:nil]; 
} 

+ (id)objectWithParameterA:(A *)a parameterB:(B *)b parameterC:(C *)c 
{ 
    return [[self alloc] initWithParameterA:a parameterB:b parameterC:c]; 
} 

は、私は追加のメソッド呼び出しでグループA結果はを取得するという些細な意味を理解します実際の初期化ロジックはありますが、いずれのデザインについても深いことはありますか?

+0

ドゥを与えるだろう。 –

答えて

2

この質問は、あまりにも多くの意見に基づいている - だからあなたが求める人はすべて異なっている可能性があります。私はグループAであるDRY'erコードとなるだろう、私は多分、

+ (id)objectWithParameterA:(A *)a 
{ 
    return [self objectWithParameterA:a parameterB:nil]; 
} 

+ (id)objectWithParameterA:(A *)a parameterB:(B *)b 
{ 
    return [self objectWithParameterA:a parameterB:b parameterC:nil]; 
} 

+ (id)objectWithParameterA:(A *)a parameterB:(B *)b parameterC:(C *)c 
{ 
    return [[self alloc] initWithParameterA:a parameterB:b parameterC:c]; 
} 

を行うだろうそれは別のメソッド呼び出しを追加しますが、私はありませんが、あなたが使用してグループ

はスタイルの問題ですこの行を2回繰り返します。私はプロファイリングがこれが問題であることが判明した場合、メソッド呼び出しのパフォーマンスヒットについて心配していました。

は、私は、おそらくinit方法にプロファイラは、それが問題だあなたに伝えない限り、維持する最も簡単な方と同じ治療

- (id)initWithParameterA:(A *)a 
{ 
    return [self initWithParameterA:a parameterB:nil]; 
} 

- (id)initWithParameterA:(A *)a parameterB:(B *)b 
{ 
    return [self initWithParameterA:a parameterB:b parameterC:nil]; 
} 

- (id)initWithParameterA:(A *)a parameterB:(B *)b parameterC:(C *)c 
{ 
    // Actual initialization logic 
} 
+0

私は実際にこのスタイルを最初に持っていたので、それはちょうど意見の問題であるかもしれないと思います。 – LucasTizma

0

重要な警告が1つあります。object...は保持されていないオブジェクトを返すべきであり、new...は保持されたオブジェクトを返すべきです。したがって、事前ARCのobject...メソッドにはautoreleaseが含まれていました。今すぐARC後にこれを行うことはできませんので、あまりにも無視されたパターンnew...は新しい人生を呼吸してきました。

@ Robのコメント後の明確化:ARCは、object...new...の正しいコードを生成します。以前は手動で行う必要があった自動解放を挿入します(後者のコードを次のように変更する必要はありません)。 alloc + initはあなたに保持されたオブジェクトを与えます)。このことを考えると、あまり無視されているnew...フォームは、ARCコードに適していると思います。自動解放を行う必要がないことは、それを行うよりも優れています。

+1

ARCでは、メソッド名が新しい/ alloc/copyパターンに適合しない場合、自動解放が自動的に実行されます。 –

+0

@Rob:正解、私は明確ではなかった。私は答えで明らかにする。 – CRD

+0

コンパイラは、冗長保持/解放/自動解放呼び出しを取り除くので、すべてのARCコードで実際には問題になりません。 – hypercrypt

関連する問題