1

可能重复:
箭头运算符 (->) 在 C 中的使用
点 (“.”) 运算符和箭头 (“->”) 运算符在 C 与 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

4 回答 4

6

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

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

复制对象时,您希望获得与当前状态完全匹配的结果副本selfinit实现这一点的最简洁方法通常是显式设置副本的 ivars,以防止重载或访问器可能导致的任何副作用。它是“安全的”,因为执行它的代码仍然位于有问题的类中,因此如果您需要更改或添加 ivars,您也可以使用可能需要的任何其他知识来更新此代码。

Doing this from outside the class in question is bad form, and there's no good reason to do it.

于 2012-09-24T21:20:58.277 回答
2

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

当你说:

newItem->_stringValue

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

运算符在 C++中->很常见,但在 Objective-C 中并不常见。

于 2012-09-24T21:16:24.223 回答
2

在 Objective C 中,就像在 C++ 中一样,p->m 表示法等价于 (*p).m,即解引用指向基类型的指针,然后调用相应的方法或属性。

因此,在您的情况下,使用另一种表示法,它看起来像这样:

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

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

于 2012-09-24T21:17:52.613 回答
2

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

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

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

于 2012-09-24T21:19:08.147 回答