プロジェクトを実行しているときに、viewcontrollers @synthezied プロパティを介してビューコントローラーのインスタンス変数を設定するか、init が呼び出されたときにインスタンス変数を設定する新しい init 関数を作成する必要があるかどうか疑問に思っていました。
私にとっては、 @properties を使用してインスタンス変数を設定する方がクリーンなようです。
どう思いますか?
ニブや絵コンテは使いません...
プロジェクトを実行しているときに、viewcontrollers @synthezied プロパティを介してビューコントローラーのインスタンス変数を設定するか、init が呼び出されたときにインスタンス変数を設定する新しい init 関数を作成する必要があるかどうか疑問に思っていました。
私にとっては、 @properties を使用してインスタンス変数を設定する方がクリーンなようです。
どう思いますか?
ニブや絵コンテは使いません...
プロパティを介して使用できるインスタンス変数の設定のように、指定された初期化子アプローチを使用し@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
。
プロパティを統合すると、setter と getter を作成する手間が省けます。を使用するだけ@synthesize
では、プロパティは初期化されません。それらを宣言するとき、または宣言するときに、必ずそれらを初期化する必要があり-init
ます。
一般に、指定された初期化子には、厳密に必要なパラメーターのみを含める必要があります。readwrite @property など、任意のものは通常、別の場所に移動します。ここには、あなたの裁量である程度の余裕があります - 実際にはほとんどの場合に使用されるため、オプションのパラメーターを含める場合があります (そうでない場合は、nil や 0 などの簡単なデフォルトがあります)。
init メソッドによって返されるオブジェクトは、何らかの方法で使用できるようにする必要があるという考えです。それを構成するために追加の手順が必要になることは、ほとんどの場合、設計が不十分であることを示しています。
この原則に従うと、不変のインスタンスも促進されます (多くの場合、必要なすべてのパラメーターを前もって指定できるため)。これは、単純さ、予測可能性、スレッド セーフ、copy-by-retain など、多くの理由で有利です。
特にView Controllerの場合、通常、制御するビューを取得し、他のすべてを@propertiesとして残すイニシャライザがあります。ビュー コントローラーは、ビュー セットだけである程度は機能するはずです。他のすべてのプロパティには、適切なデフォルトが必要です。