0

私はデモを見ていますが、Objective C のプログラミング スタイルに関するいくつかの基本的なことを理解していないことに気付きました。デモはたまたまスタンフォードの CS193P のレクチャー 14 でした。以下のコードを参照して、何が私を混乱させているかを確認してください。セッターと関係があると思います。

@synthesize photoDatabase = _photoDatabase;

- (void)setPhotoDatabase:(UIManagedDocument *)photoDatabase
{
    if (_photoDatabase != photoDatabase)
        _photoDatabase = photoDatabase;
}

このコードは、この講義/デモの youtube ビデオの 25:00 からのものです。ここで photoDatabase と呼ばれる合成プロパティは、たまたま UIManagedDocument 型です。

私の最初の質問は、@synthesize myProperty = _myProperty でアンダースコアを使用する理由です。プログラミング全般に慣れていないので、少し混乱しています。XCode 4 の時点で、このプロパティを参照するときにアンダースコアの必要性をなくすために部分的に統合していませんか?

2 番目の質問は、setPhotoDatabase: メソッドの目的は何ですか。講師はこのメソッドをオーバーライドしていると思います。正確にはどのような目的で?

4

3 に答える 3

2

アンダースコアは、実際の ivar が生成されるデフォルトの方法です。それはあなたが一種のメタになることを可能にします。クラスの内部では、このようにそれらを直接参照して、ゲッターまたはセッターへの不要なメソッド呼び出しを回避できます。また、スコープを明確に保ち、​​プロパティと同じ名前を使用し、他のメソッド宣言の引数の変数名に getter を使用できるようにします。これにより、メソッドへの引数がそのプロパティに関連することを意図していることが暗黙的に示されます。アンダースコアは、メソッド内でローカル変数が ivar と衝突しないようにします。

ivar 名を非常に異なるものとして手動で合成することにより、サブクラスの作成者から ivar 名を意図的に隠すことができます。
これを使用するのは、SPI が機能しないことを行う場合に、サブクラスの作成者から ivar を保護するためです。

このようなセッター メソッドの目的は、規則とキー値のコーディングに準拠することです。ivar を設定するために他のクラスで使用されます。

合成されたものを超える機能を提供する必要がある場合は、独自のセッターを手動で実装できます。これには、データの検証や通知のトリガーなどが含まれます。

于 2013-06-28T09:48:36.737 に答える
1

アンダースコアは、変数をメソッド変数ではなくインスタンス変数としてマークする方法にすぎません。public メンバーを使用するのは悪い習慣であるため、setter と getter を使用するのが普通です。@synthesizeキーワードの後のキーワードに応じて、ゲッターとセッターを自動的に生成し@propertyます。( arc 使用時)、( arcretain使用時) などのセッターとゲッターを生成できます。strongassignweak

また、これらの自動生成されたメソッドをオーバーライドして、ロジックを追加することもできます。たとえば、この値が変更されるたびにコンソールにメッセージを出力したり、プロパティを変更した後にビューを更新したりすることができます。

于 2013-06-28T09:36:57.513 に答える