关于iphone:ViewController = _ViewController含义

ViewController = _ViewController meaning

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Prefixing property names with an underscore in Objective C

我刚开始开发iPhone应用程序,注意到当您生成一个新项目时,可以在appdelegate.m中看到以下代码

1
2
@synthesize window = _window;
@synthesize viewController = _viewController;

在appdelegate.h文件中,

1
2
@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;

我想知道这到底是什么意思,特别是合成部分。它是实例化局部私有变量?如果是这样,这和说@综合视控器;

谢谢


模式@synthesize foo = bar;允许您定义键foo的一个属性,该属性与名为bar的实例变量(如果需要,也可以是_foo的实例变量)结合合成,而@synthesize foo;只简单地合成同名的属性和实例变量(foo即)。

1
2
@property (...) Foo *foo;
@synthesize foo = _foo;

相当于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@interface MyClass : NSObject {
    //result of @synthesize...:
    Foo *_foo;
}

//result of @property...:
- (void)setFoo:(Foo *)foo;
//result of @property...:
- (Foo *)foo;

@end

@implementation MyClass

//result of @synthesize...:
- (void)setFoo:(Foo *)foo {
    _foo = foo; //simplified!
}

//result of @synthesize...:
- (Foo *)foo {
    return _foo; //simplified!
}

@end

合成实例变量将通过_fooself->_foo(前者实际上是隐式形式)使用,这将不涉及任何访问器方法调用。

虽然synthezed属性将通过self.foo使用,然后将使用对合成访问器方法之一的调用。

@synthesize foo;想象成一个隐含的@synthesize foo = foo;(注意这里没有_),等号)。


或多或少。.h中的这些行声明存在两个名为window和controller的公共变量:

1
2
@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;

但是这些行只声明变量的存在,它们实际上并不创建变量。这取决于类如何实现它们——例如,它们可能是虚拟变量,实际上并不存在,而是调用以编程方式创建数据的方法,或者从数据库或其他地方加载数据。

.m文件中的这些行实际上创建("合成")变量。

1
2
@synthesize window = _window;
@synthesize viewController = _viewController;

这些行实际上表示内部变量名是window,但变量的公共名称是window。这意味着在类中,可以通过

1
_window = something;

但在外部,你必须使用

1
appDelegate.window = something;

因为那是公共名称。也可以使用self.window在内部访问类。

Objective-C的另一个有趣的事实是,使用点语法以这种方式访问变量实际上只是调用setter和getter方法访问变量的一种简便方法。因此,合成线除了创建一个名为"窗口"的变量外,还定义了以下两种方法:

1
2
- (void)setWindow:(UIWindow *)window; // to set the _window variable
- (UIWindow *)window; // to get the _window variable

如果您愿意,可以直接调用这些方法,使用

1
2
[self setWindow:someValue];
UIWindow *window = [self window];