首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本目标-C语法

问基本目标-C语法
EN

Stack Overflow用户
提问于 2016-05-12 07:23:53
回答 2查看 82关注 0票数 1

两者有什么区别?

代码语言:javascript
复制
cell.classHour.backgroundColor=[UIColor blackColor];

和

代码语言:javascript
复制
[cell.classHour setBackgroundColor:[UIColor blackColor]];

如您所见,我试图在UILabel中设置UITableViewCell的背景色。不知怎么的,第一种方法对我没用。我一直以为这两种方法都会起同样的作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-12 07:40:16

tl;dr:

两条线的结果一致率为99.5%。

.之间有什么区别?

语义上的差别是非常微妙的。几乎在所有情况下,编译的可执行文件都没有区别。

第一行使用属性语法,使编译器查找匹配的属性声明。当它找不到一个时,它将查找一个匹配的setter声明:

代码语言:javascript
复制
- (void)setBackgroundColor:(UIColor *)value;

当编译器找到匹配的设置器时,它仍然会接受点标记。

即使有(默认)属性声明.

代码语言:javascript
复制
@property UIColor *backgroundColor;

..。编译器只是插入对setBackgroundColor:的调用,因为属性声明意味着存在这个名称的setter。

我一直以为这两种方法都会起同样的作用。

只要在编译时知道接收方的静态类型,点表示法和显式调用setter是相同的。如果接收器的静态类型是id,编译器将不允许点标记。

当有一个具有显式setter名称的属性声明时,这两种样式之间唯一的真正区别是:

代码语言:javascript
复制
@property (setter=setColor) UIColor *backgroundColor;

在这种假设的情况下,编译器实际上将为这两行生成不同的代码:使用属性语法时的setColor:,使用显式消息发送时的setBackgroundColor:。

不知怎么的,第一种方法对我没用。

最后一部分可能不是你问题的原因。我添加它是为了指出消息发送和属性访问的单一区别。

虽然更改getter名称很常见(对于布尔属性而言),但很少使用显式setter名称。我从未在苹果的框架中看到过这种情况。

票数 3
EN

Stack Overflow用户

发布于 2016-05-12 07:32:17

这两个都指向相同的api。一个机会可能是操作系统的错误,请检查您正在测试的操作系统,并在其他版本测试。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37179987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档