繁体   English   中英

Objective-C消息语法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM