在以下代码中:
_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;
工作正常。
答案 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;