我见过用于结构的箭头符号的例子。在一个教程中,我在视图控制器实现文件中看到了这种语法:
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";
任何一行代码都可以正常运行。那么为什么要使用上述一条线而不是另一条?
另请注意,箭头符号会产生_myInputField.text
。下划线有什么意义?
答案 0 :(得分:2)
在Objective-C中,对象也是c结构。如果你是这门语言的新手,那么这些知识会给你带来更多的麻烦。但它有助于解释你所看到的内容。
Objective-C属性是一个有用的构造,它在对象中创建一个ivar(类的结构中的一个新字段),默认为以下划线为前缀的属性名称。属性还将创建getter和setter方法,例如- (UITextFeild *)myInputField
和- (void)setMyInfputField
。
Dot符号是Objective-C语法糖,它调用Objective-C setter和getter方法。 ->
箭头符号是C语法,它将取消引用对象的指针并访问对象的ivar的struct字段。
重要的是要理解点语法实际上是生成对这些方法的调用,因此您不要尝试覆盖这些方法,并且无意中包含对自身的调用。
- (UITextFeild *)myInputField
等生成方法的默认实现看起来像这样
- (UITextFeild *)myInputField {
return self->_myInputField;
}
但Objective-C还有另一个语法助手,允许您在不写出_myInputField
的情况下访问self->
。所以以下实现是相同的。
- (UITextFeild *)myInputField {
return _myInputField;
}
使用直接ivar访问有一些很好的理由 - 最大的原因是实现自定义setter和getter,性能以及对KVO语言功能的仔细控制。但是在现代的Objective-C中,除非你真的知道自己在做什么,否则应该避免使用它。
如果您想了解更多信息,请阅读Apple's documentation on Objective-C
答案 1 :(得分:1)
self.myInputField.text = @"another test";
该代码调用myInputField
getter 方法。这样做有充分的理由,所以通常最安全。
self->_myInputField.text = @"text field test";
该代码直接访问_myInputField
实例变量。
本例中的myInputField
getter方法也访问_myInputField
实例变量,这就是两个调用似乎做同样事情的原因。但这只是一个实施细节; getter方法完全可以访问不同命名的实例变量,执行其他操作(副作用),或者根本不访问任何实例变量。