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

标签 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

请注意,我在 & 行之前直接将这些变量用作左值...

它怎么能在我毫无错误地赋值给它之后立即提示一个值不是左值呢?这与 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/

相关文章:

ios - MobileSubstrate - 检查对象在哪个包中

objective-c - 应用程序应该在应用程序启动结束时有一个 Root View Controller wait_fences : failed to receive reply: 10004003

ios - 作为 C 指针类型的 Objective-C 类

ios - 从 Swift 设置 Objective-C 类的属性

Swift 下标具有不同的 getter 和 setter 签名

ruby - Spec RSpec 模型属性 setter

c - l 需要作为增量操作数的值

c++ - 为什么 --list.end() 编译?

C++ 字符数组 : error while copying data

ios - 在 Objective-C 的 Viewcontroller 类之外的 uiwebview Controller 上调用函数