在学习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.
有人可以解释那里发生的事情吗?
提前致谢!
答案 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。 (谷歌分开)。
它还带来了点语法,这是语法糖,换句话说,编译器以与相应括号语法相同的方式解释它。
点和括号语法都由编译器以相同的方式转换为相同类型的调用。
没有功能差异。