何时使用括号以及何时使用Objective-C中的句点

时间:2009-10-15 15:52:03

标签: objective-c

我是一名新的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得到句号?

有人可以轻易地为我解释这个吗?

5 个答案:

答案 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也可以使用[],但是使用点运算符只需要更短的手...否则你必须提供参数等,这只是更长的符号。

希望这会有所帮助。