两者有什么区别?
cell.classHour.backgroundColor=[UIColor blackColor];和
[cell.classHour setBackgroundColor:[UIColor blackColor]];如您所见,我试图在UILabel中设置UITableViewCell的背景色。不知怎么的,第一种方法对我没用。我一直以为这两种方法都会起同样的作用。
发布于 2016-05-12 07:40:16
tl;dr:
两条线的结果一致率为99.5%。
.之间有什么区别?
语义上的差别是非常微妙的。几乎在所有情况下,编译的可执行文件都没有区别。
第一行使用属性语法,使编译器查找匹配的属性声明。当它找不到一个时,它将查找一个匹配的setter声明:
- (void)setBackgroundColor:(UIColor *)value;当编译器找到匹配的设置器时,它仍然会接受点标记。
即使有(默认)属性声明.
@property UIColor *backgroundColor;..。编译器只是插入对setBackgroundColor:的调用,因为属性声明意味着存在这个名称的setter。
我一直以为这两种方法都会起同样的作用。
只要在编译时知道接收方的静态类型,点表示法和显式调用setter是相同的。如果接收器的静态类型是id,编译器将不允许点标记。
当有一个具有显式setter名称的属性声明时,这两种样式之间唯一的真正区别是:
@property (setter=setColor) UIColor *backgroundColor;在这种假设的情况下,编译器实际上将为这两行生成不同的代码:使用属性语法时的setColor:,使用显式消息发送时的setBackgroundColor:。
不知怎么的,第一种方法对我没用。
最后一部分可能不是你问题的原因。我添加它是为了指出消息发送和属性访问的单一区别。
虽然更改getter名称很常见(对于布尔属性而言),但很少使用显式setter名称。我从未在苹果的框架中看到过这种情况。
发布于 2016-05-12 07:32:17
这两个都指向相同的api。一个机会可能是操作系统的错误,请检查您正在测试的操作系统,并在其他版本测试。
https://stackoverflow.com/questions/37179987
复制相似问题