x.y = z和[x setY:z]之间有什么区别;在Objective-C?

时间:2013-01-11 19:39:52

标签: ios objective-c

  

可能重复:
  Style: Dot notation vs. message notation in Objective-C 2.0
  Objective-C Property Access

在向我提出否决问题之前,我不知道在这个问题上我不知道该搜索什么..无论如何,让我们说我试图改变一个问题的背景颜色。 imageview,有什么区别:

imageView.backgroundColor = [UIColor orangeColor];

[imageView setBackgroundColor:[UIColor orangeColor]];

我知道第一个可以用来获取实际值,我可以说

UIColor *imageViewColor = imageView.backgroundColor;

并且我不能与另一个人这样做,但为什么另一个存在呢?或者使用第一个作为设定值的方式是完全错误的?但是,为什么它有效?

这个问题对于改变背景颜色和imageView没有什么特别之处,我只是一般地问一下,实际差异是什么。

3 个答案:

答案 0 :(得分:4)

绝对没有。它们是等价的。

(嗯,语法不同。)

顺便说一下,

  

并且我不能用另一个

做到这一点

不是真的。这两种表示法都有setter和getter语法:

object.property = value;

相当于

[object setProperty:value];

variable = object.property;

相当于

variable = [object property];

此外,

  

但为什么另一个存在?

因为在旧版本的Objective-C(“Objective-C 1.0”)中没有属性。一个人必须手动实现setter和getter方法,这是普遍接受的命名约定。

  

或者使用第一个作为设置值的方法是错误的吗?

不,不是。

  

但是,为什么它有效?

因为它不是“错误”,所以这就是原因。 (但是,你为什么不谷歌呢?)

答案 1 :(得分:3)

点符号是访问@property值的简短形式 - 请参阅此相关的SO问题:Objective-C Property Access

  

编译器在编译时将foo.property转换为[foo属性]

问题Dot notation vs. message notation for declared properties讨论了选择一种风格优于另一种风格的优点

答案 2 :(得分:0)

简短的回答是两者在执行方面完全相同。

现在,更准确地说,Objective-C在2.0中添加了属性。点语法是在属性上调用访问器方法的简便方法。访问器方法是用于获取或设置属性值的方法。有时你会听到他们被称为吸气者和制定者。

那么当你说imageView.backgroundColor = someColor时会发生什么?基本上,编译器查找setBackgroundColor方法并调用该方法。类似地,如果你说UIColor *color = imageView.backgroundColor,编译器会查找一个名为backgroundColor的方法,它返回一个UIColor并调用该方法。

这里要实现的是,只有在属性上调用访问器方法时才应该使用点语法。 Objective-C允许您使用点语法进行常规消息发送,但这往往会掩盖项目中发生的事情并使代码可维护性成为一个大问题。