Objective-C消息语法

时间:2014-08-05 09:12:40

标签: objective-c

在学习Objective-C时我偶然发现了以下代码,我不明白:

RootViewController *rootViewController = (RootViewController *)[self.navigationController topViewController];

据我了解

[self.navigationController topViewController]

正在将消息(调用方法)topViewController发送到self.navigationController

查看.h文件我只发现topViewController是属性,而不是函数:

@property(nonatomic,readonly,retain) UIViewController *topViewController; // The top view controller on the stack.

有人可以解释那里发生的事情吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

语法都可以:

[self.navigationController topViewController]

self.navigationController.topViewController

后者正在调用属性的 getter 方法,该方法可能如下所示:

- (UIViewController *)topViewController
{
    return _topViewController;
}

如果将后者定义为@property,我会更喜欢后者。

答案 1 :(得分:1)

"点语法"是另一种调用方法的方法(只有那些没有任何参数的方法才能以这种方式调用)。

所以声明:

[self.navigationController topViewController]

实际上解释为:

[[self navigationController] topViewController]

表示:

  • 消息navigationController将发送到对象self
  • 消息topViewController将发送到navigationController返回的对象。

属性本身只是定义方法的一种奇特方式。 readonly属性仅提供getter(foo),读/写属性还提供setter(setFoo:)。默认情况下,编译器生成这些方法以访问也是隐式定义的变量_foo

答案 2 :(得分:1)

属性实际上是一种约定,意味着您拥有符合标准样式的访问者方法,setter和getter的ivars,并提供从传统样式派生的其他功能。

使用Objective-C 2.0,我们得到了合成属性。也就是说,编译器将生成大量的样板代码,以便为您制定符合约定的ivars和相关的setter和getter方法,并提供最重要的一致内存管理和KVC和KVO。 (谷歌分开)。

它还带来了点语法,这是语法糖,换句话说,编译器以与相应括号语法相同的方式解释它。

点和括号语法都由编译器以相同的方式转换为相同类型的调用。

没有功能差异。