之间有什么区别
cell.classHour.backgroundColor=[UIColor blackColor];
和
[cell.classHour setBackgroundColor:[UIColor blackColor]];
如您所见,我试图在UITableViewCell中设置UILabel的背景颜色。 不知何故,第一种方法对我不起作用。 我一直认为这两种方法都是一样的。
答案 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。一个机会可能是操作系统错误,请检查您正在测试的操作系统并在其他版本中进行测试。