基本Objective-C语法

时间:2016-05-12 07:23:54

标签: objective-c syntax

之间有什么区别
cell.classHour.backgroundColor=[UIColor blackColor];

[cell.classHour setBackgroundColor:[UIColor blackColor]];

如您所见,我试图在UITableViewCell中设置UILabel的背景颜色。 不知何故,第一种方法对我不起作用。 我一直认为这两种方法都是一样的。

2 个答案:

答案 0 :(得分:3)

<强> TL; DR:

两条线都有99.5%的相同结果。

  

[...]

之间有什么区别

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

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

- (void)setBackgroundColor:(UIColor *)value;

编译器在找到匹配的setter时仍会接受点表示法。

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

@property UIColor *backgroundColor;

...编译器只是插入对setBackgroundColor:的调用,因为属性声明暗示存在此名称的setter。

  

我一直以为两种方法都会这样做。

只要接收器的静态类型在编译时已知,点符号和显式调用setter是相同的。如果接收器的静态类型为id,则编译器将不允许使用点表示法。

当存在具有显式setter名称的属性声明时,两种样式之间唯一真正的区别就出现了:

@property (setter=setColor) UIColor *backgroundColor;

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

  

不知何故,第一种方法对我不起作用。

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

虽然更改 getter 名称很常见(对于布尔属性),但很少使用明确的 setter 名称。我从未在Apple的框架中看到这一点。

答案 1 :(得分:-1)

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