对于非结构,在Objective-C中使用Dot与箭头表示法

时间:2014-04-20 16:23:34

标签: ios7 xcode5

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

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。下划线有什么意义?

2 个答案:

答案 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方法完全可以访问不同命名的实例变量,执行其他操作(副作用),或者根本不访问任何实例变量。