31

重複の可能性:
セッターとゲッター (Noobie) - iPhone SDK

私はここで初心者です。この 2 か月間 iOS の学習を始めたばかりで、プログラミングのバックグラウンドはありません。(ただし、Javaは少し)。Objective Cのゲッターとセッターとは何か説明してもらえますか? それらの用途は何ですか?@propertyとを@synthesize使用する理由

4

3 に答える 3

87

Getter は、プロパティ ( で宣言) にアクセスする (から値を読み取る) たびに呼び出されるメソッドです@property。そのメソッドが返すものはすべて、そのプロパティの値と見なされます。

@property int someNumber;

...

- (int)someNumber {
    return 42;
}

...

NSLog("value = %d", anObject.someNumber); // prints "value = 42"

Setter は、プロパティ値が変更されるたびに呼び出されるメソッドです。

- (void)setSomeNumber: (int)newValue { // By naming convention, setter for `someValue` should 
                                    // be called `setSomeValue`. This is important!
    NSLog("someValue has been assigned a new value: %d", newValue);
}

...

anObject.someNumber = 19; // prints "someValue has been assigned a new value: 19"

通常、getter から同じ値を返し、setter で新しい値を出力するだけではあまり意味がありません。実際に何かを保存するには、クラスでインスタンス変数 (ivar) を宣言する必要があります。

@interface SomeClass : NSObject {
    int _someNumber;
}

アクセサー (getter と setter の総称) を作成して、その値を保存/取得します。

- (int)someNumber {
    return _someNumber;
}

- (void)setSomeNumber:(int)newValue {
    _someNumber = newValue;
}

...

SomeClass *anObject = [[SomeClass alloc]init];
anObject.someNumber = 15;
NSLog(@"It's %d", anObject.someNumber); // prints "It's 15"

さて、そのプロパティは通常の変数と同じように動作します。そのすべてのコードを書くことのポイントは何ですか?

まず、これからはアクセサーに追加のコードを追加できます。これは、プロパティがアクセスまたは変更されるたびに実行されます。これを行う理由は複数あります。たとえば、ある種の非表示の計算を実行したり、オブジェクトの状態を更新したり、何かをキャッシュしたりしたい場合があります。

次に、Cocoa には Key-Value Coding (KVC) および Key-Value Observing (KVO) と呼ばれる優れたメカニズムがあります。それらはプロパティに依存します。それらについては、Developer Library: KVC Programming GuideおよびKVO Programming Guideで読むことができます。ただし、これらは高度なトピックです。

最後に、Objective C では、オブジェクトの静的割り当てはありません。すべてのオブジェクトが動的に割り当てられます ( reason )。オブジェクト ポインターを (プロパティではなく) インスタンス変数に保持したい場合は、新しい値を ivar に割り当てるたびにすべてのメモリ管理を手動で行う必要があります (自動参照カウントがオンの場合は当てはまりません)。プロパティを使用すると、いくつかのメモリ管理コードをアクセサーに配置して、作業を楽にすることができます。

この説明は、Objective C のメモリ管理に精通していない人にはあまり意味がないと思います。そのため、実際のドキュメントやチュートリアルを読むか、すべてを学習するまで (インスタンス変数の代わりに) プロパティを使用してください。いずれにせよ詳細。個人的には、2 番目のオプションは好きではありませんが、それはあなた次第です。

を使用@synthesizeして、コンパイラに基本的なアクセサーと基になるインスタンス変数を自動的に生成させることができます。-(int)someNumber上記のコード (および)の代わりに、次のよう-(void)setSomeNumber:に記述できます。

@synthesize someNumber = _someNumber; // = _someNumbers tells compiler 
                                      // to name the instance variable `_someNumber`. 
                                      // You could replace it with = `_somethingElse`, of
                                      // course, but that's an ill idea.

この 1 行でint _someNumber変数、someNumberゲッター、setSomeNumberセッターが生成されます。アクセサーに、インスタンス変数から値を格納/取得するだけでなく、より複雑なことをさせたい場合は、それらを自分で作成する必要があります。

これがすべて意味をなすことを願っています。

于 2012-05-03T07:05:06.723 に答える
5

「ゲッター」と「セッター」は、変数 (フィールド) への変更を制御するために使用されます。

「セッター」は、カプセル化の原則に従って、オブジェクト指向プログラミングで最もよく使用されます。この原則に従って、クラスのメンバー変数は非公開にして他のコードから保護し、パブリック メンバー関数によってのみ変更できます。パブリック メンバー関数は、必要な新しい値をパラメーターとして受け取り、必要に応じてそれを検証し、プライベート メンバー変数。

多くの場合、「セッター」には、プライベート メンバー変数の値を返す「ゲッター」(アクセサーとも呼ばれます) が付随します。

Getter/Setter メソッドは、非オブジェクト指向環境でも使用できます。この場合、変更する変数への参照が、新しい値とともにメソッドに渡されます。このシナリオでは、コンパイラは、コードが getter/setter メソッドをバイパスして変数を直接変更することを制限できません。変数がこれらのメソッドによってのみ変更され、直接変更されないようにする責任は開発者にあります。

それらをサポートするプログラミング言語では、プロパティは、カプセル化の有用性をあきらめることなく、便利な代替手段を提供します。

于 2012-05-03T06:00:08.800 に答える
3

ほとんどのオブジェクト指向言語のプロパティ「ゲッター」と「セッター」は、クラスのインスタンスのプライベート メンバーの周りに「外部」またはユーザー インターフェイスを提供します。一部の OO 批評家はそれらを「シンタックス シュガー」と呼んでいますが、要するに、クラスのコンシューマーは、実際のプライベート メンバー自体にアクセスするのではなく、プログラムで制御するこれらのインターフェイスを使用するということです。このようにして、(たとえば) プライベート変数が無効な値や範囲外の値を受け取らないように保護したり、getter のみを提供して setter を提供しないことでプロパティを読み取り専用にすることができます。さらに興味深いのは、getter と setter が、クラスにネイティブに保持されていないプロパティをラップできるという考えです。

ゲッターとセッターは、Objective-C に固有のものではありません。他の OO 言語でプログラミングを続けると、C#、Java などでそれらのフレーバーを見つけることができます。

幸運を。

于 2012-05-03T05:58:05.383 に答える