3

プロジェクトを実行しているときに、viewcontrollers @synthezied プロパティを介してビューコントローラーのインスタンス変数を設定するか、init が呼び出されたときにインスタンス変数を設定する新しい init 関数を作成する必要があるかどうか疑問に思っていました。

私にとっては、 @properties を使用してインスタンス変数を設定する方がクリーンなようです。

どう思いますか?

ニブや絵コンテは使いません...

4

3 に答える 3

2

プロパティを介して使用できるインスタンス変数の設定のように、指定された初期化子アプローチを使用し@synthesizedます。ビュー コントローラを初期化してからそのプロパティを設定すると、オブジェクトが一貫性のない状態のままになります。

指定された初期化子:

MyViewController * viewController = [[MyViewController alloc] initWithParam1:@"foo" param2:@5];
// now viewController is consistent as presumably it has all properties set

セッターによるプロパティの設定:

MyViewController * viewController = [[MyViewController alloc] init];
// here viewController is inconsistent as it does not have default properties set
[viewController setParam1:@"foo"];
[viewController setParam2:@5];
// only here viewController is consistent and can be used normally

イニシャライザの実装によっては、プロパティのデフォルト値を params としてイニシャライザに渡さずに設定することもできます。そのため、init が暗黙のうちに param1 を に@foo、param2 を に設定すると、2 番目の例が失敗する可能性があります@5

于 2012-11-29T14:02:44.850 に答える
2

プロパティを統合すると、setter と getter を作成する手間が省けます。を使用するだけ@synthesizeでは、プロパティは初期化されません。それらを宣言するとき、または宣言するときに、必ずそれらを初期化する必要があり-initます。

于 2012-11-29T13:58:34.150 に答える
1

一般に、指定された初期化子には、厳密に必要なパラメーターのみを含める必要があります。readwrite @property など、任意のものは通常、別の場所に移動します。ここには、あなたの裁量である程度の余裕があります - 実際にはほとんどの場合に使用されるため、オプションのパラメーターを含める場合があります (そうでない場合は、nil や 0 などの簡単なデフォルトがあります)。

init メソッドによって返されるオブジェクトは、何らかの方法で使用できるようにする必要があるという考えです。それを構成するために追加の手順が必要になることは、ほとんどの場合、設計が不十分であることを示しています。

この原則に従うと、不変のインスタンスも促進されます (多くの場合、必要なすべてのパラメーターを前もって指定できるため)。これは、単純さ、予測可能性、スレッド セーフ、copy-by-retain など、多くの理由で有利です。

特にView Controllerの場合、通常、制御するビューを取得し、他のすべてを@propertiesとして残すイニシャライザがあります。ビュー コントローラーは、ビュー セットだけである程度は機能するはずです。他のすべてのプロパティには、適切なデフォルトが必要です。

于 2012-11-29T16:43:37.010 に答える