什么是 - >运算符在-copyWithZone中执行:?

时间:2012-09-24 21:12:22

标签: objective-c ios

  

可能重复:
  Arrow operator (->) usage in C
  Dot (“.”) operator and arrow (“->”) operator use in C vs. Objective-C

我是一名新手,正在查看2008年最新更新的免费软件/开源程序,我无法通过以下符号识别->

- (id)copyWithZone:(NSZone *)zone
{
  GFIPGeniusItem * newItem = [[[self class] allocWithZone:zone] init];
  newItem->_stringValue = [_stringValue copy];
  newItem->_imageURL = [_imageURL copy];
  newItem->_webResourceURL = [_webResourceURL copy];
  newItem->_speakableStringValue = [_speakableStringValue copy];
  newItem->_soundURL = [_soundURL copy];
  return newItem;
}

我认为它允许某种捷径,但我特别喜欢它的作用。

4 个答案:

答案 0 :(得分:6)

这是一种从该对象外部直接访问ObjC对象中的实例变量的方法。 (语法和->是从C结构中借用的,表现就像引用是指向结构的指针一样。)

此访问机制在这一点上几乎是退化的,并且在现代ObjC代码中非常罕见,因为良好的封装需要使用访问器和属性,而不是直接触及实例变量。但在某些非常特殊的情况下,这是合法的,而且这是其中之一:

复制对象时,您希望获得与当前self的状态完全匹配的结果副本。实现这一目标的最简洁方法通常是明确设置副本的ivars,以防止init重载或访问者可能导致的任何副作用。它安全"因为执行此操作的代码仍位于相关类中,因此如果您需要更改或添加ivars,则可以使用其他可能需要的知识更新此代码。

在课堂外面这样做是不好的形式,并没有充分的理由去做。

答案 1 :(得分:2)

这是一个指针间接运算符。 a->b(*a).b的含义相同(其中.是结构成员访问运算符,而不是Objective-C的属性点语法)。

当你说:

newItem->_stringValue

您正在直接访问newItem指向的对象的_stringValue实例变量。

->运算符在C ++中非常常见,但在Objective-C中则不是很多。

答案 2 :(得分:2)

在Objective C中,与C ++一样,p-> m表示法等效于(* p).m这是指向基类型的指针的取消引用,然后调用相应的方法或属性。

所以在你的情况下,使用其他符号,它看起来像这样:

(*newItem)._stringValue = [_stringValue copy];

(使用 - >运算符更常见)

答案 3 :(得分:2)

在Objective-C中,你有两种变量类型的访问器。每个人都应该知道的是"."一个(例如Class.variable)。此类型调用适当的getter或setter。

现在,另一种类型 - 您要求的类型 - 用于课堂使用。显然,当使用"."表示法自动调用getter或setter时,您需要一种在没有setter的情况下设置变量的方法(在setter中调用setter会导致无限循环)。因此,使用此"->"符号 - >简单地说,它是直接访问模式。

通常,Objective-C两个符号的变量名都是相同的,但有些人更喜欢使用以"_"开头的类内符号变量名。这是通过将@synthesize variable行编辑为@synthesize variable = _variable来实现的。