“LValue”不代表我认为的意思吗?

时间:2010-01-14 16:29:49

标签: objective-c setter lvalue

在以下代码中:

_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

请注意,我正在将这些变量作为左值直接用于&线......

如果一个值在我没有错误的情况下分配给它后,怎么会抱怨它不是左值?这与目标C创造的神奇的吸气剂/孵化器有关吗?

我想我需要解释一些背景来解释为什么我想要获得地址:

在我以前的SO帖子中,我展示了相同的代码,打印%d并发现在分配后,由于某种原因,属性仍为0。所以,我想我会尝试获取属性的地址以查看它们存储的位置,也许我可以弄清楚为什么我没有成功分配它们,然后就发生了这种情况。

我认为,正如人们提到的那样,是的,当我做出这个分配时,obj-c可能会秘密地用一个叫做二传的人来取代它(然后是其他一些魔法,因为在另一个SO帖子中,有人提到了

BOOL b = [_imageView setHasVerticleScroller: YES]

失败了,但是

BOOL b = _imageView.hasVerticalScroller = YES;

工作正常。

2 个答案:

答案 0 :(得分:3)

我不是百分百肯定,但我会抓住答案。

这些属性都是BOOL类型,它们(我相信)是Objective-C中的unsigned char。 (也许是一个int,我记不清了,但它就是这样的。)所以你试图取(&)这些属性的地址。但你实际上并没有直接访问伊娃;属性通过方法调用来获取它们的值。所以你试图获取方法的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);

答案 1 :(得分:2)

_imageView.hasHorizontalScroller = YES; - 在此行中您可以访问imageView中的属性 - 因此您实际上不会访问值,而是调用 setter 方法:

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

在第二个示例中,您还可以访问属性,但这次调用getter方法并返回BOOL。因此,作为mipadi指出,您不需要在该NSLog语句中使用&

我建议在obj-c中阅读关于properties的文档。

修改: here您可以找到有关为什么属性在您提到的多个赋值语句中工作的讨论:

BOOL b = _imageView.hasVerticalScroller = YES;