视图控制器 = _视图控制器 的含义

7

可能是重复问题:
在Objective C中使用下划线作为属性名称的前缀

我刚开始学习iPhone应用开发,注意到当你生成一个新项目时,在AppDelegate.m文件中会看到以下代码:

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

在AppDelegate.h文件中,它说

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

我只是想知道这到底是什么意思,特别是合成部分。它是实例化一个本地私有变量吗?如果是这样的话,那么与说“@synthesize viewController;”有什么不同呢?
谢谢

1
https://dev59.com/4Gw05IYBdhLWcg3wiybg/ https://dev59.com/i3RA5IYBdhLWcg3wzhNY/ https://dev59.com/bUzSa4cB1Zd3GeqPllSe/ https://dev59.com/BVfUa4cB1Zd3GeqPJpsi/ http://stackoverflow.com/search?q=%5Bobjc%5D+underscore+property&submit=search - jscs
2个回答

6
模式@synthesize foo = bar;允许您定义一个关键字foo的属性,该属性与名称为bar的实例变量(如果需要,也可以是_foo)结合使用,而@synthesize foo;仅综合了相同名称(即foo)的属性和实例变量。
@property (...) Foo *foo;
@synthesize foo = _foo;

这有点相当于这个:
@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(前者实际上是一个隐式形式)使用,这不涉及任何访问器方法的调用。
而合成的属性将通过 self.foo 使用,这将利用其中一个合成的访问器方法的调用。
只需将 @synthesize foo; 视为隐式的 @synthesize foo = foo;(请注意,此处没有下划线,名称相同)。

5

有点儿相似。这些.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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接