有点儿相似。这些.h文件中的代码声明了两个公共变量,分别被称为window和controller:
@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;
但是这些行仅声明变量的存在,它们并不实际创建变量。由类根据自己的需要来实现这些变量 - 例如,它们可以是虚拟变量,实际上不存在,但调用方法来以编程方式创建数据或从数据库中加载数据。
在.m文件中的这些行实际上创建(“synthesize”)变量。
@synthesize window = _window
@synthesize viewController = _viewController
这些代码实际上是在说明内部变量名为_window,但变量的公共名称为window。这意味着在类内部,您可以通过直接说
_window = something;
但是,在外部,您需要使用以下方式访问它:
appDelegate.window = something;
因为这是它的公共名称。您也可以使用self.window在类内部访问它。
Objective-C 的另一个有趣之处是,使用点语法以这种方式访问变量实际上只是调用setter和getter方法的一种方便方式。因此,synthesize行除了创建名为_window的变量外,还定义了以下两种方法:
- (void)setWindow:(UIWindow *)window; // to set the _window variable
- (UIWindow *)window; // to get the _window variable
如果您喜欢,您可以直接调用这些方法,使用:
[self setWindow:someValue];
UIWindow *window = [self window];