【问题标题】:Objective-c -> Structure Operator [duplicate]Objective-c - >结构运算符[重复]
【发布时间】:2013-09-16 13:50:30
【问题描述】:

在阅读一些我第一次发现“结构运算符”的教程时,我读到它用于引用实例变量。

-(void)setNumber:(int)n{
   self.number = n;
}

-(void)setNumber:(int)n{
   self->number = n;
}

我的疑问是:它到底在做什么?我什么时候使用它?为什么我更喜欢它而不是点符号?

【问题讨论】:

  • 请记住,Objective-C 是建立在 C 之上的,并且所有 C 语法都“显示出来”。基本上,-> 的 C 语义被原封不动地转移到 Objective-C 中,而额外的语义被重载到 . 上,这与该标记在 C 中的含义相比。(并且您之前至少需要对 C 有基本的了解你尝试学习/使用 Objective-C。)

标签: iphone ios objective-c c cocoa


【解决方案1】:

Objective-C 中的点语法只是语法糖,它被编译器替换为方法调用。 -> 解引用指针并直接访问成员,不调用任何方法。

在一个 Objective-C 方法调用中,你不需要说 self->foo,如果你的类有一个名为 foo 的实例变量,编译器会推断出它的 self-> 部分。因此,虽然并非完全没有听说过,但将 -> 与 Objective-C 对象一起使用是比较少见的。

【讨论】:

  • 他们为什么不直接删除这种语法?它只会造成麻烦
  • 仍有合法用途(直接访问非自身实例的实例变量——例如,在实现 NSCopying 时很有用),更不用说 -> 在 C 中仍有大量合法用途,其中 Objective-C 是一个严格的超集。
【解决方案2】:

箭头-> 运算符直接访问实例变量,您通常不希望这样做,因为它违反了封装并规避了访问器方法(这可能是问题的潜在根源,例如 KVO不工作或一些预期的副作用没有发生)。

相反,您应该几乎总是使用.,因为它使用getter 和setter 访问属性。

【讨论】:

  • OP 发布了一个访问器方法实现的示例。在这些情况下,直接访问 ivar 是正确且常见的。
  • @TimDoll 在某些情况下需要箭头符号并且有意义。此外,Objective-C 作为 C 的严格超集,不能删除 C 的特性。
  • @TimDoll 查看 ipmcc 关于 NSCopying 的评论。实现isEqual:compare: 是类似的情况。
  • @NikolaiRuhe 即使在访问器方法中也不需要箭头运算符。在任何实例方法中,可以访问 ivars 而无需将它们引用为 self->ivar。此外,此答案在技术上是正确的,因此您的反对票无效。
  • @H2CO3 箭头运算符在访问器中使用是完全有效的,就像在其他任何地方一样。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多