gpt4 book ai didi

objective-c - "LValue"不是我想的意思吗?

转载 作者:太空狗 更新时间:2023-10-30 03:52:24 33 4
gpt4 key购买 nike

在下面的代码中:

_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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com