首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewController = _ViewController意义

ViewController = _ViewController意义
EN

Stack Overflow用户
提问于 2012-02-10 22:14:04
回答 2查看 1.1K关注 0票数 7

可能重复:

Prefixing property names with an underscore in Objective C

我刚开始iphone开发,注意到当您生成一个新项目时,下面的代码可以在AppDelegate.m中看到

代码语言:javascript
复制
@synthesize window = _window;
@synthesize viewController = _viewController;

在AppDelegate.h文件中写着

代码语言:javascript
复制
@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;

我只想知道这到底意味着什么,特别是合成部分。它是否实例化局部变量?如果是这样的话,这和说“合成viewController”有什么区别?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-02-10 22:17:20

模式@synthesize foo = bar;允许您定义键foo的属性,该属性与名称bar的实例变量(如果需要的话是_foo )组合在一起,而@synthesize foo;只需合成具有相同名称的属性和实例变量(即foo)。

代码语言:javascript
复制
@property (...) Foo *foo;
@synthesize foo = _foo;

与此相当:

代码语言:javascript
复制
@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; (注意这里缺少一个_,同名)。

票数 6
EN

Stack Overflow用户

发布于 2012-02-10 22:23:49

或多或少。.h中的这些行声明存在两个称为窗口和控制器的公共变量:

代码语言:javascript
复制
@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;

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

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

代码语言:javascript
复制
@synthesize window = _window;
@synthesize viewController = _viewController;

这些行实际上表明内部变量名是_window,但是变量的公共名称是窗口。这意味着,在类中,您可以通过以下方式直接访问变量

代码语言:javascript
复制
_window = something;

但在外部,您必须使用

代码语言:javascript
复制
appDelegate.window = something;

因为那是公开的名字。您还可以使用self.window在内部访问该类。

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

代码语言:javascript
复制
- (void)setWindow:(UIWindow *)window; // to set the _window variable
- (UIWindow *)window; // to get the _window variable

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

代码语言:javascript
复制
[self setWindow:someValue];
UIWindow *window = [self window];
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9235556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档