5

オブジェクトを作成して初期化するには、次の 2 つの方法のどちらが望ましいですか?

MyClass oClass = [[MyClass alloc] init];
oClass.length = 5;
oClass.text = @"Hello";

または、ほぼ同じコードを含むが次のようなクラスメソッドを使用します。

MyClass oClass = [MyClass myClassWithLength:(int) 5 andText:(NSString *) @"Hello"];

物事が複数の方法で行われ、一方が他方よりも優れているかどうか、またはその理由がわからないのを見るのは嫌いです。

4

4 に答える 4

9

嫌いにならないでください。:-)

ちなみに、私はあなたが意味したと仮定しています:

編集:不要なキャストを削除)

MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];

複数の init... メソッドを使用する理由は、開発者が適切に初期化されたインスタンスを作成しやすくするためです。したがって、たとえば、開発者が長さとテキストを使用して MyClass のインスタンスを頻繁に作成する必要がある場合は、それを 1 つのステップで実行できるようにする API を提供することで、開発者の負担を軽減できます。また、開発者がテキスト文字列だけで MyClass のインスタンスを頻繁に作成する必要がある場合は、-initWithText:メソッドを提供することもできます。

また、この方法で作成されたインスタンスが一時オブジェクトとして頻繁に使用される (つまり、インスタンス変数または静的変数に格納されていない) 場合+myClassWithText:は、提供されたテキスト文字列で初期化された MyClass の自動解放されたインスタンスを返すようなクラス コンビニエンス メソッドを追加することもできます。

どちらが優れているかについては、可能であればオブジェクトを完全に初期化する方が常に良いため、オブジェクトが両方の値を適切に初期化する必要がある場合は、両方の引数を提供できるメソッドを使用してください。また、作成中のインスタンスへの参照を格納する必要がない場合は、クラス コンビニエンス メソッドを使用して、コードでメモリ管理を処理する必要がないようにします。

于 2010-03-10T15:26:49.583 に答える
2

オブジェクトが長さとテキストなしでは使用できない場合は、2 番目のオプションの方が適している可能性があります。これらのフィールドがオプションの場合は、最初のフィールドの方が適しています。

しかし、私はこの質問に絶対的な真実があるとは思いません。

于 2010-03-10T15:11:57.930 に答える
0

多くのプロパティを持つクラスがある場合、1 行のコードですべてを初期化することはほとんどありません。どちらの方法も私にとってはうまくいきます。

于 2010-03-10T15:12:47.673 に答える
0

initWithSomething:メソッドが利用可能で、それらのプロパティの初期値を提供したい場合は、より単純であるという理由だけで、私は常にそれを好みます。また、クラスの不変バージョンでも常に機能します。

しかし、どちらの init メソッドも本質的に「優れた」ものではありません。通常、クラスには 1 つまたは 2 つの指定されたイニシャライザがあり、他のすべてのクラスはデフォルト値でそれらを呼び出すだけです。インスタンスのプロパティがそのままになるとは限りません。クラスのドキュメントには、その初期化子が何を行うか、およびクラスの指定された初期化子はどれかを示す必要があります。たとえば、[[NSDate alloc] init]NSDate の指定された初期化子を使用initWithTimeIntervalSinceReferenceDate:して、現在の日付と時刻を表す日付オブジェクトを作成します。

ちなみに、これは、クラスをサブクラス化するときに、指定された初期化子をオーバーライドするだけでよいことも意味します。他の人はそれを呼び出すだけなので、あなたの新しい動作を無料で取得できます。

于 2010-03-10T16:12:43.680 に答える