[英]Objective-C message syntax
在学习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.
有人可以解释那里发生了什么吗?
提前致谢!
两种语法都可以:
[self.navigationController topViewController]
和:
self.navigationController.topViewController
后者正在调用属性的getter方法,该方法可能如下所示:
- (UIViewController *)topViewController
{
return _topViewController;
}
如果将其定义为@property
我希望后者。
“点语法”是调用方法的另一种方式(只能以这种方式调用没有任何参数的方法)。
所以声明:
[self.navigationController topViewController]
实际上被解释为:
[[self navigationController] topViewController]
意思是:
navigationController
被发送到对象self
。 topViewController
被发送到navigationController
返回的对象。 属性本身只是定义方法的一种好方法。 只读属性仅提供getter( foo
),读/写属性还提供setter( setFoo:
。 默认情况下,编译器生成这些方法以访问也隐式定义的变量_foo
。
属性实际上是一种约定,这意味着您拥有具有访问器方法,setter和getter的ivars,它们符合标准样式并提供了从常规样式派生的其他功能。
使用Objective-C 2.0,我们获得了综合特性。 也就是说,编译器将生成大量样板代码,以遵循约定并为您提供ivars以及相关的setter和getter方法,并提供最重要的一致的内存管理以及KVC和KVO。 (分别搜索这些)。
它还带来了点语法,这是语法糖,换句话说,编译器以与相应的括号语法相同的方式解释它。
编译器将点和括号语法以相同方式转换为相同类型的调用。
没有功能上的差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.