Ios7 非结构的Objective-C中的点对箭头符号

Ios7 非结构的Objective-C中的点对箭头符号,ios7,xcode5,Ios7,Xcode5,我见过用于结构的箭头符号示例。在一个教程中,我在视图控制器实现文件中看到了以下语法: self->webView.canGoBack) backButton.enabled = YES; 我不知道他们为什么不使用点符号。没有解释。我在一个有按钮和文本字段的简单项目中尝试了这个方法。下面是我在按钮按下方法中的内容: //header file @property (strong, nonatomic) IBOutlet UITextField *myInputField; //impl

我见过用于结构的箭头符号示例。在一个教程中,我在视图控制器实现文件中看到了以下语法:

self->webView.canGoBack) backButton.enabled = YES;
我不知道他们为什么不使用点符号。没有解释。我在一个有按钮和文本字段的简单项目中尝试了这个方法。下面是我在按钮按下方法中的内容:

//header file

@property (strong, nonatomic) IBOutlet UITextField *myInputField;

//implementation file

self.myInputField.text = @"another test";
//self->_myInputField.text = @"text field test";
这两行代码都可以正常工作。那么,为什么要使用上面的一行而不是另一行呢


另外,请注意,箭头符号生成
\u myInputField.text
。下划线的意义是什么?

在Objective-C中,对象也是C结构。如果你不熟悉这门语言,那么这些知识会给你带来更多的麻烦。但这有助于解释你所看到的

Objective-C属性是一个有用的构造,它在对象(类结构中的一个新字段)中创建一个ivar,默认为以下划线为前缀的属性名称。属性还将创建getter和setter方法,例如
-(uitextfield*)myInputField
-(void)setmyinputfield

点表示法是Objective-C语法糖,它调用Objective-C setter和getter方法。
->
箭头符号是C语法,它将取消引用对象的指针并访问对象的ivar的结构字段

理解点语法实际上是在生成对这些方法的调用是很重要的,因此不要试图重写这些方法,而无意中包含对它们自己的调用

生成的方法(如
-(uitextfield*)myInputField
的默认实现如下所示


-(uitextfield*)myInputField{
返回self->\u myInputField;
}

但是Objective-C还有另一个语法助手,允许您访问
\u myInputField
,而无需写出
self->
。因此,下面的实现是相同的


-(uitextfield*)myInputField{
返回\u myInputField;
}

使用直接ivar访问有一些很好的理由——最大的理由是自定义setter和getter的实现、性能以及对KVO语言特性的仔细控制。但在现代Objective-C中,除非你真的知道自己在做什么,否则应该避免这样做

如果你想了解更多,请阅读

该代码调用
myInputField
getter方法。这样做可能有很好的理由,所以通常是最安全的

self->_myInputField.text = @"text field test";
该代码直接访问
\u myInputField
实例变量


本例中的
myInputField
getter方法还访问
\u myInputField
实例变量,这就是为什么这两个调用似乎执行相同的操作。但这只是一个实施细节;getter方法完全可以访问不同名称的实例变量、执行其他操作(副作用)或根本不访问实例变量。

有关我的完整讨论,请参见:
self->_myInputField.text = @"text field test";