基本Objective-C语法

基本Objective-C语法,objective-c,syntax,Objective C,Syntax,两者的区别是什么 cell.classHour.backgroundColor=[UIColor blackColor]; 及 如您所见,我试图在UITableViewCell中设置UILabel的背景色。 不知为什么,第一种方法对我不起作用。 我一直认为这两种方法都是一样的。这两种方法都指向同一个api。一个可能是操作系统错误,请检查您正在测试的操作系统,并在其他版本中进行测试。tl;医生: 两条线有99.5%的相同结果 […]之间有什么区别 语义上的差异非常微妙。几乎在所有情况下,编译后的

两者的区别是什么

cell.classHour.backgroundColor=[UIColor blackColor];

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

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

tl;医生:

两条线有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名称。我从未在苹果的框架中看到过这一点。

这是正确的答案。唯一缺少的是苹果文档的链接。你可能应该解释第一种方法在哪方面不适合你。
@property (setter=setColor) UIColor *backgroundColor;