3

重複の可能性:
Objective-Cでのみプロパティを使用している場合、ivarを宣言する理由はありますか?
ObjectiveCivarsまたは@property

私はiPhoneプログラミング(そしてプログラミングシーン全体)に不慣れです。私はさまざまな場所でプロパティについて調べてみましたが、基本的には、他のクラスがそれらのオブジェクトにアクセスするためのgetterメソッドとsetterメソッドを作成するためのショートカットであることがわかりました。

これで、プログラマーが@interface:UIViewControllerの後の中括弧と、そのクラスの.mファイル内ですべてのアクセスが行われる後のプロパティでオブジェクトを定義するのを見てきました。

さて、その余分な(?)コードは必要ですか?これは標準ですか?わかりやすいご意見をお待ちしております。

前もって感謝します。

4

1 に答える 1

10

私はあなたの質問をいくつかの方法で解釈することができます:

質問:なぜ一部のプログラマーはプロパティとインスタンス変数(中括弧内で定義された変数)を使用し、他のプログラマーはプロパティのみを使用し、他のプログラマーはインスタンス変数のみを使用するのですか?

回答:ご存知のように、@property宣言は、あなたが宣言すると@synthesize、ゲッターとセッターを生成します。歴史的に、これはあなたのためにそれがしたすべてであり、あなたはまたあなたのインスタンス変数を手動で宣言しなければなりませんでした。その後、コンパイラが改善され、インスタンス変数が定義されていない場合でも、@synthesizeステートメントがそれを生成するようになりました。これが最初に導入されたとき、一般的な慣習はプロパティとインスタンス変数の両方を定義することでしたが、Appleは最終的にガイドラインを変更し、プログラマーにインスタンス変数を定義しない@propertyように促しましたが、コンパイラーにand@synthesize宣言からそれ自体を生成させました。

したがって、あなたの質問に答えて:1.プロパティのインスタンス変数を定義することは今や不必要です。2.もはや必要ありません。3.インスタンス変数を明示的に宣言するのではなく、@synthesizeステートメントに宣言させることが標準になりました。

余談ですが、@synthesizeステートメントの規則は、と呼ばれるプロパティを使用してvar、インスタンス変数名の前にアンダースコアを付けること@synthesize var = _varです。これは、プロパティが意図されたときにプログラマーが誤ってivarを参照する可能性を最小限に抑えるために行われます(またはその逆)。これが推奨される標準であることをさらに説明するために、Xcode 4.4以降では、@synthesizeステートメントでさえオプションであり(したがって、を定義します@propertyが、ivarは定義せず、noを定義します@synthesize)、先頭を除いて、プロパティと同じ名前を宣言してivarします。アンダースコア。

質問:一部のプログラマーが.mファイルでプロパティとインスタンス変数の一部を定義するのはなぜですか?他のプログラマーが、クラス自体の.mファイル内でのみ使用されているのに、.hファイルでインスタンス変数とプロパティの一部を宣言するのはなぜですか。

回答: .mファイル(いわゆるクラス拡張子)内で定義されたインスタンス変数とプロパティは、世界中にアドバタイズされていないivars/propertiesを定義するための便利な方法にすぎません。この規則では、.hファイルは単なるパブリックインターフェイス(他の場所から呼び出すことができるプロパティとメソッド)になり、他のすべては.mファイルに入ります。これは、インターフェイスを少しすっきりさせておくための優れた方法です。将来、クラスを使用するときに、.hファイルを確認するだけで、クラスの実装の詳細に迷うことはありません。

以前は、クラス拡張が普及する前に、プライベートでクラス自体の.mファイル内でのみ使用されていたとしても、すべてのインスタンス変数とプロパティを.hファイルで定義していました。したがって、これを行うコードがまだ表示されます。

したがって、あなたの質問に答えて、1.クラス拡張を使用することは不要ではありません(クラス拡張が空でない限り、それでも私はそれを保持する傾向があるので、プライベートivar /プロパティがないことがわかります)。2.クラス拡張の使用は必要ありません。ただし、3。クラス自体の中でのみ使用されるプライベートプロパティ/変数のクラス拡張の使用は、新しい標準であり、おそらくベストプラクティスを表しています。

于 2012-08-05T16:57:34.233 に答える