在下面的代码中:
_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 创建的神奇 getter/setter 有关系吗?
我想我需要解释一些上下文来解释为什么我要尝试获取地址:
在我之前的 SO 帖子中,我展示了相同的代码,打印 %d 并发现在赋值之后,出于某种原因属性仍然为 0。所以,我想我会尝试获取属性的地址以查看它们的存储位置,也许我可以弄清楚为什么我没有成功分配给它们,然后就发生了这种情况。
我认为正如人们提到的那样,是的,当我执行赋值时,obj-c 可能会 secret 地用对 setter 的调用替换它(然后是其他一些魔法,因为在另一篇 SO 帖子中,其他人提到过
BOOL b = [_imageView setHasVerticleScroller: YES]
失败了,但是
BOOL b = _imageView.hasVerticalScroller = YES;
工作正常。
最佳答案
我不是 100% 确定,但我会尝试一下答案。
这些属性都是 BOOL
类型,(我相信)这是 Objective-C 中的 unsigned char
。 (也许是一个 int
,我不记得了,但它是类似的东西。)所以你试图获取 (&
) 这些属性的地址。但是您实际上并没有直接访问 ivars;属性通过方法调用来获取它们的值。所以你试图获取方法的 BOOL
返回值的地址,但由于你实际上没有将值 分配给 任何东西,所以没有地址 - - 你只是拥有值(value)。
如果你这样做,你会遇到同样的问题:
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);
关于objective-c - "LValue"不是我想的意思吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2065680/