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; |
我想知道这到底是什么意思,特别是合成部分。它是实例化局部私有变量?如果是这样,这和说@综合视控器;
谢谢
模式
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 |
合成实例变量将通过
虽然synthezed属性将通过
把
或多或少。.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]; |