4

私はCGSizeのプロパティを持っています:

@property (nonatomic) CGSize descriptionSize;

'

@synthesize descriptionSize = _descriptionSize;

ドット構文を使用して高さにアクセスできます。

self.descriptionSize.height = 35;

しかし、これはブラケット構文でどのように機能しますか?

[self setDescriptionSize:???];

私にはばかげているように見えましたが、手がかりが得られません。前もって感謝します!

4

3 に答える 3

6

これは、プロパティのドット表記の落とし穴の 1 つです。self.descriptionSize.height の 2 つのドットは同じように見えますが、意味は大きく異なります。1 つ目は「get descriptionSize」メソッドにマップされるプロパティ アクセサーですが、2 つ目は古い学校の構造体参照です。最初のドットは、オブジェクトのサイズ値へのポインターではなく、CGSizeスカラーを返します。2 番目のドットが返された CGSize の高さを設定する場合、オブジェクトの値を変更するのではなく、スタックに値を設定しています。これはあなたがそれをしなければならない方法です:

CGSize size = self.descriptionSize;
size.height = 35;
self.descriptionSize = size;

…またはプロパティのドット表記のない同等のもの:

CGSize size = [self descriptionSize];
size.height = 35; // we still use the dot here: size is a struct not an object
[self setDescriptionSize:size];
于 2012-05-04T06:45:28.217 に答える
5

の実装は構造体のコピーdescriptionSize返すので、それを直接操作することはできず、それが機能することを期待します。あなたがする必要があるのは、構造体全体を取得し、それを変更してから、それを元に戻すことです。CGSizeCGSize

CGSize size = [self descriptionSize];
size.height = 35;
[self setDescriptionSize:size];

ただし、のプロパティで作業していて、そのプロパティがオブジェクトselfではない場合、メモリ管理が必要になるため、サイズを変更する最も効率的な方法は次のとおりです。

_descriptionSize.height = 35;

ただし、次の場合は、以前のゲッター/セッターアプローチを使用します。

  1. オブジェクトはではありませんでしselfた。
  2. サイズ変更の副作用として何かを行うためにsetterメソッドを手動で記述しました(たとえば、ビューを自動的に更新するためにビューのビットを無効にする)。
于 2012-05-04T06:38:47.470 に答える
2

ドット構文は、構造体参照 (CGSize は C 構造体)、または目的の C メッセージ送信の 2 つの異なることを意味します。

理論的には、 のようなメソッドがある場合、次のよう- (void)doSomething;に呼び出すことができますmyObject.doSomething; //bad style。これをしないでください。ドット構文は、値を取得または設定する以外に、実際に何かを行うメソッドを呼び出すためのものではありません (ただし、言語や IDE には何もありません)。

プロパティを合成すると、アクセサ メソッド- (myType)myPropertyとが作成されます- (void)setMyProperty:(myType)newValue。ここで、ドット構文を使用すると、通常の方法でゲッターにアクセスでき (ゲッターは通常の Objective-C メソッドであるため)、セッターには特別なケースがあります: myObject.myProperty = newValuegets に変換され[myObject setMyProperty:newValue]ます。

これは、プロパティのドット構文と Objective-C スタイルのメッセージ送信構文を切り替えることができることを意味します (技術的には、他のすべてのパラメーターなしの Objective-C メソッドの送信についても) が、構造体メンバーにアクセスするにはドット構文を使用する必要があります。構造体はオブジェクトではなく、メソッドを認識しています。

于 2012-05-04T07:02:09.500 に答える