2

私はまだ ObjC の初心者です。どこでもかなり標準的であることに気付きました

@interface myObj : NSObject {
    id delegate;
    NSDictionary *dict;
}

その後

@property (nonatomic,retain) NSDictionary *dict;
@property (retain) id delegate;

- 例えば。Apple のDeclared Propertiesページのおかげで、自動コード生成と @property のより明確な定義がどれほど役立つかを知っています。しかし、私が理解していないのは、人々が両方を行うのが標準である理由です-プロパティを宣言してから、{中括弧}に再度入れます。

つまり、一部の変数に自動ゲッター/セッターを持たせたいクラスがあり、一部の変数に自動ゲッター/セッターを持たせたくないクラスがある場合、通常の変数の {} ブロックを使用し、 @property/@synthesize ステートメントのみを作成することを理解できます機能を追加したい特定の変数だけです。しかし、すべてのインスタンス変数にゲッターとセッターが必要であることがわかっている場合に、常に両方を持つことが標準である理由は何ですか? 私は基本的に、それが本当に必要ではないと感じたときに、このように100%使用されているのを見ているので、つまずいていると思います... @propertiesを宣言してそのままにしておきます。

考え?ベスト コーディング プラクティスの提案はありますか? それとも、私がここで見逃している情報がありますか?

4

2 に答える 2

4

表示されているものは、Objective-Cの以前のバージョンでは必要でしたが、現在はそうではありません。

新しいランタイムが導入されるまで(Mac OSXのObjective-C2.0で)NeXTで使用されていたObjective-Cの最初のバージョンでは、すべてのインスタンス変数をクラスの構造の一部として宣言する必要がありました@interface。その理由は、クラスをサブクラス化した場合、コンパイラーは、サブクラスのインスタンス変数を配置するオフセットを確認できるように、クラスのインスタンス変数のレイアウトを知る必要があるためです。

プロパティが導入されたとき、合成されたプロパティは、クラスの構造内のインスタンス変数によって「バックアップ」される必要がありました。したがって、インスタンス変数とプロパティの両方を宣言する必要がありました。

上記のすべてはもはや真実ではありません。新しいObjective-Cは、インスタンス変数のオフセットを検索する方法が脆弱ではありません。これは、いくつかの変更を意味します。

  • すべてのインスタンス変数がにある必要はありません@interface@implementation衝突やその他の問題が発生する可能性があるため、カテゴリではなく、:で定義できるようになりました。
  • 合成されたプロパティのインスタンス変数は、プロパティ定義に基づいて推測および作成できます。
  • 実行時に作成するクラスにインスタンス変数をプログラムで追加できます(システムで使用可能なクラスを登録する前のみ)。

したがって、繰り返しになりますが、Objective-C言語の古いバージョンでは、インスタンス変数と合成プロパティの両方を宣言するだけで済みます。あなたが見ているものは冗長であり、「ベストプラクティス」と見なされるべきではありません。

于 2012-06-14T13:23:41.183 に答える
0

私はプロパティをパブリック変数として、他のプロパティをプライベート変数として考える傾向がありますが、「本当に必要ない」と言うときは正しいです。

ivarを省略した場合でも、ivarは作成されます

すべてのivarが一緒になり、インターフェイス宣言の直後に中括弧内に収まるように、両方を作成します

@interface MyClass
{
    int variable1;
}
@end
于 2012-06-14T13:21:56.707 に答える