2

可能重复:样式:Objective-C 2.0 Objective-C 属性访问
中的点表示法与消息表示法

在对 noob-question 竖起大拇指之前:我不知道在这个问题上要搜索什么。无论如何,假设我正在尝试更改 imageview 的背景颜色,有什么区别:

imageView.backgroundColor = [UIColor orangeColor];

[imageView setBackgroundColor:[UIColor orangeColor]];

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

UIColor *imageViewColor = imageView.backgroundColor;

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

顺便说一下,这个问题与改变和 imageView 的背景颜色无关,我只是在问一般情况,实际区别是什么..

4

3 回答 3

4

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

(嗯,语法不同。)

顺便一提,

我不能和另一个人一起做这个

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

object.property = value;

相当于

[object setProperty:value];

variable = object.property;

相当于

variable = [object property];

此外,

但是为什么另一个存在呢?

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

或者使用第一个作为设置值的方式是完全错误的?

不,不是。

但是,为什么它会起作用?

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

于 2013-01-11T19:43:00.623 回答
3

点表示法是访问值的一种简写方式@property- 请参阅这个相关的 SO 问题:Objective-C Property Access

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

声明属性的点表示法与消息表示法的问题讨论了选择一种样式而不是另一种样式的优点

于 2013-01-11T19:42:56.980 回答
0

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

现在,更准确地说,Objective-C 在 2.0 中添加了属性。点语法是在属性上调用访问器方法的简写方式。访问器方法是用于获取或设置属性值的方法。有时您会听到它们被称为 getter 和 setter。

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

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

于 2013-01-11T19:46:10.440 回答