我是一名新的iPhone / Objective-C开发人员,因为我正在阅读不同的教程和开源代码,我在理解何时使用方括号“[]”以及何时使用时遇到一些问题使用句点“。”来访问对象的属性/方法。
例如,此代码:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
UIColor *backgroundColor = nil;
if (selected){
backgroundColor = [UIColor clearColor];
} else {
backgroundColor = [UIColor whiteColor];
}
self.todoTextLabel.backgroundColor = backgroundColor;
self.todoTextLabel.highlighted = selected;
self.todoTextLabel.opaque = !selected;
self.todoPriorityLabel.backgroundColor = backgroundColor;
self.todoPriorityLabel.highlighted = selected;
self.todoPriorityLabel.opaque = !selected;
}
为什么[UIColor clearColor]
得到括号,但todoTextLabel.backgroundColor
得到句号?
有人可以轻易地为我解释这个吗?
答案 0 :(得分:26)
我在新代码中看到的惯例是使用点作为属性,始终使用方括号作为消息/选择器(您称之为 methods )。该点是在Objective-C 2.0中引入的,因此您在网上找到的信息的分歧并非完全出乎意料。
完全有可能在所有内容中使用方括号(和我做):
foo = [myObject backgroundColor];
[myObject setBackgroundColor:foo];
相当于
foo = myObject.backgroundColor;
myObject.backgroundColor = foo;
重申一下,你不应该使用点作为消息,只使用属性。
要回答您的具体问题,[UIColor clearColor]
属于括号,因为它不是属性;它实际上是UIColor
(+(UIColor)clearColor
)的类消息。
你听起来像是来自Java世界,所以这可能会有所帮助:
MyObject *foo = [[MyObject alloc] initWithAwesome:YES]; /* MyObject foo = new MyObject(TRUE); */
[foo doSomethingWithNumber:5 andString:"five"]; /* foo.doSomething(5, "five"); */
MyColor *bar = foo.faceColor; /* MyColor bar = foo.faceColor; */
MyColor *baz = [foo faceColor]; /* MyColor baz = foo.faceColor; */
foo.backColor = bar; /* foo.backColor = bar; */
[foo setUndersideColor:baz]; /* foo.undersideColor = baz; */
“setXXX”和“XXX”消息来自合成的动态属性,是Objective-C的习惯用语。 “点”只是调用这些方法的简写,大致相同。
编辑:现在我已经有了一些赞成,是时候让你们中的一些人重新考虑>:)
我从不使用圆点,你也不应该。
答案 1 :(得分:5)
我对属性使用点表示法,因为,
for ( Person *person in group.people){ ... }
比
更容易阅读for ( Person *person in [group people]){ ... }
在第二种情况下,通过将你的大脑置于消息发送模式来中断可读性,而在第一种情况下,很明显你正在访问组对象的people属性。
我还会在修改集合时使用它,例如:
[group.people addObject:anotherPerson];
比
更具可读性[[group people] addObject:anotherPerson];
在这种情况下,重点应该是将对象添加到数组而不是链接两条消息。
答案 2 :(得分:3)
Big Nerd Ranch的点符号some thoughts值得一读。
还有rebuttal。
答案 3 :(得分:2)
通过(强)约定,属性访问器被写为以getter的实例变量命名的方法,以及用于setter的前缀为“set”的(大写)实例变量名称(因此,例如变量foo,你有foo和setFoo)。
正如其他人所指出的,从Objective-C 2.0开始,如果你编写了object.foo,它将映射到方法调用[object foo],如果获取或[object setFoo:arg]进行设置。您可以使用任何一种形式,即使仅使用Objective-C 2.0,有些人仍然更喜欢完整的方法语法。
Objective-C 2.0的一个单独但相关的补充是用于生成getter和setter的@ property / @ synthesize / @ dynamic关键字。你可以用点符号混合和匹配 - 一个不需要另一个。
答案 4 :(得分:0)
是的,我刚开始学习这个:
与其他语言不同,在对象上调用方法的语法不是objName.someMethod();
这是[objName someMethod]
点运算符用于获取或设置类中属性的值。这是做某事的简短方法。
正如我所见,点运算符总是在对象的实例上使用,而[...]可以在对象的实例上使用或静态使用(使用类名)。
todoTextLabel也可以使用[],但是使用点运算符只需要更短的手...否则你必须提供参数等,这只是更长的符号。
希望这会有所帮助。