可能重复:
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;
}
我认为它允许某种捷径,但我特别喜欢它的作用。
答案 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
来实现的。