5

次のコードでは:

_imageView.hasHorizontalScroller = YES;
_imageView.hasVerticalScroller = YES;
_imageView.autohidesScrollers = YES;

NSLog(@"scrollbar? H %p V %p hide %p", 
      &(_imageView.hasHorizontalScroller), 
      &(_imageView.hasVerticalScroller),
      &(_imageView.autohidesScrollers));

エラーが発生します:

Controller.m:143: error: lvalue required as unary '&' operand
Controller.m:144: error: lvalue required as unary '&' operand
Controller.m:145: error: lvalue required as unary '&' operand

これらの変数を & 行の直前の左辺値として使用していることに注意してください...

エラーなしで割り当てた直後に、値が左辺値ではないことをどのように訴えることができますか? これは、Objective C が作成する魔法のゲッター/セッターと関係がありますか?

アドレスを取得しようとしている理由を説明するために、いくつかのコンテキストを説明する必要があると思います。

以前の SO 投稿で、同じコードを示し、 %d を出力し、割り当ての後、何らかの理由でプロパティがまだ 0 であることを発見しました。そのため、プロパティのアドレスを取得して、それらが保存されている場所を確認しようと考えました。おそらく、それらに正常に割り当てられない理由を理解できると思いましたが、これが起こりました.

人々が言及したように、ええ、おそらく私が代入 obj-c を行うとき、密かにそれをセッターへの呼び出しに置き換えていると思います(別のSO投稿で、他の誰かがそれを言及したため、他の魔法

BOOL b = [_imageView setHasVerticleScroller: YES]

失敗しますが、

BOOL b = _imageView.hasVerticalScroller = YES;

正常に動作します。

4

2 に答える 2

3

100%確信はありませんが、答えを突き刺すつもりです。

これらのプロパティはすべてBOOLタイプでありunsigned char、Objective-Cでは(私は信じています)。(たぶんint、私は思い出せませんが、それはそのようなものです。)それで、あなたは&それらのプロパティの()のアドレスを取得しようとしています。ただし、実際にはivarに直接アクセスしているわけではありません。プロパティは、メソッド呼び出しを経て値を取得します。したがって、メソッドの戻り値のアドレスを取得しようとしていますが、BOOL実際には値何にも割り当てていないため、アドレスはありません。値があるだけです。

これを行った場合も同じ問題が発生します。

static int returnOne(void)
{
    return 1;
}

// Later...

NSLog(@"returnOne is %p", &returnOne());    // Oops, the return value of returnOne has no address!

ログ呼び出しは次のようになります。

NSLog(@"scrollbar? H %d V %d hide %d", 
  _imageView.hasHorizontalScroller, 
  _imageView.hasVerticalScroller,
  _imageView.autohidesScrollers);
于 2010-01-14T16:35:02.133 に答える
2

_imageView.hasHorizontalScroller = YES;- この行では、imageView のプロパティにアクセスします。したがって、実際には値にアクセスするのではなく、setterメソッドを呼び出します。

[_imageView  setHasHorizontalScroller:YES]; // Equivalent of your code.

2 番目の例ではプロパティにもアクセスしますが、今回は getter メソッドが呼び出されて BOOL が返されます。したがって、その NSLog ステートメントで mipadi ポイントを使用する必要はありません&。 obj-c のプロパティ

に関するドキュメントを読むことをお勧めします。

編集: ここで、あなたが言及したようにプロパティが複数の割り当てステートメントで機能する理由についての議論を見つけることができます:

BOOL b = _imageView.hasVerticalScroller = YES;
于 2010-01-14T16:40:01.533 に答える