Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么是->;操作员正在执行-copyWithZone:?_Objective C_Ios - Fatal编程技术网

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,您还可以使用可能需要的任何其他知识来更新此代码

在课堂之外这样做是不好的,没有理由这样做。

但是,另一种表示法