Objective c 什么是->;操作员正在执行-copyWithZone:?
可能重复:Objective c 什么是->;操作员正在执行-copyWithZone:?,objective-c,ios,Objective C,Ios,可能重复: 我是一个新手,最近一次更新的免费/开源程序是在2008年,我不认识以下符号中的->: - (id)copyWithZone:(NSZone *)zone { GFIPGeniusItem * newItem = [[[self class] allocWithZone:zone] init]; newItem->_stringValue = [_stringValue copy]; newItem->_imageURL = [_imageURL copy]
我是一个新手,最近一次更新的免费/开源程序是在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;
}
我假设它允许某种快捷方式,但我想具体说明它的功能。这是指针间接寻址操作符
a->b
与(*a).b
(其中
是结构成员访问运算符,而不是Objective-C的属性点语法)的含义相同
当你说:
newItem->_stringValue
您直接访问newItem指向的对象的\u stringValue
实例变量
<> >代码> > >代码>运算符在C++中非常常见,但在Objul-C.</P> < P>这不是指针间接运算符。code>a->b与
(*a).b
(其中
是结构成员访问运算符,而不是Objective-C的属性点语法)的含义相同
当你说:
newItem->_stringValue
您直接访问newItem指向的对象的\u stringValue
实例变量
<> >代码> > >代码>运算符在C++中非常常见,但在目标C中,Objul-C.</P>
不是很像,C++中,P>M符号等于(*P)。M,是指针指向基类型的引用,然后是对相应方法或属性的调用。 因此,在您的情况下,使用另一种表示法,它将如下所示:
(*newItem)._stringValue = [_stringValue copy];
(在-C中,使用->运算符)
更常见,如C++中,p>m表示等价于(*p)。M,这是指针到基类型的撤销引用,随后调用相应的方法或属性。
因此,在您的情况下,使用另一种表示法,它将如下所示:(*newItem)._stringValue = [_stringValue copy];
(更常见的是使用->操作符)在Objective-C中,您有两种变量类型的访问器。每个人都应该知道的是
“
一个(例如Class.variable)。此类型调用适当的getter或setter
现在,另一种类型——您要求的类型——用于课堂使用。显然,当getter或setter使用“
符号自动调用时,您需要一种不用setter设置变量的方法(在setter本身中调用setter会导致无休止的循环)。因此,这个“->”
符号被使用->简单地说,它是直接访问模式
通常,Objective-C两种符号的变量名是相同的,但有些人更喜欢使用类内符号变量名,以
开头。这是通过将@synthesis variable
行编辑为@synthesis variable=\u variable
来实现的。在Objective-C中,您有两种变量类型的访问器。每个人都应该知道的是“
一个(例如Class.variable)。此类型调用适当的getter或setter
现在,另一种类型——您要求的类型——用于课堂使用。显然,当getter或setter使用“
符号自动调用时,您需要一种不用setter设置变量的方法(在setter本身中调用setter会导致无休止的循环)。因此,这个“->”
符号被使用->简单地说,它是直接访问模式
通常,Objective-C两种符号的变量名是相同的,但有些人更喜欢使用类内符号变量名,以开头。这是通过将@synthesis variable
行编辑为@synthesis variable=\u variable
来实现的。这是一种从对象外部直接访问ObjC对象内实例变量的方法。(语法和->
是从C结构中借用的,其行为就像引用是指向结构的指针一样)
这种访问机制在这一点上几乎是退化的,在现代ObjC代码中非常少见,因为良好的封装需要使用访问器和属性,而不是直接接触实例变量。但是,在一些非常特殊的情况下,这是合法的,这是其中之一:
复制对象时,您希望得到与当前自身的状态完全匹配的结果副本。实现这一点最干净的方法通常是显式设置副本的IVAR,以防止init
重载或访问器可能导致的任何副作用。它是“安全”的,因为执行它的代码仍然位于有问题的类中,因此如果需要更改或添加IVAR,您还可以使用可能需要的任何其他知识来更新此代码
从所讨论的类外部执行此操作是一种糟糕的形式,没有充分的理由这样做。这是一种从对象外部直接访问ObjC对象内实例变量的方法。(语法和->
是从C结构中借用的,其行为就像引用是指向结构的指针一样)
这种访问机制在这一点上几乎是退化的,在现代ObjC代码中非常少见,因为良好的封装需要使用访问器和属性,而不是直接接触实例变量。但是,在一些非常特殊的情况下,这是合法的,这是其中之一:
复制对象时,您希望得到与当前自身的状态完全匹配的结果副本。实现这一点最干净的方法通常是显式设置副本的IVAR,以防止init
重载或访问器可能导致的任何副作用。它是“安全”的,因为执行它的代码仍然位于有问题的类中,因此如果需要更改或添加IVAR,您还可以使用可能需要的任何其他知识来更新此代码
在课堂之外这样做是不好的,没有理由这样做。但是,另一种表示法