2012-02-10 63 views
6

可能重复:
Prefixing property names with an underscore in Objective C的ViewController = _ViewController意味着

我刚开始iPhone应用程序开发和发现,当你生成一个新的项目,下面的代码可以在AppDelegate中看到。 m

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

AND在AppDelegate.h文件中它说

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

我只想知道这到底意味着什么,特别是合成部分。是否 实例化一个本地私有变量?如果是这样,这与说 @synthesize viewController有什么不同?

感谢

+1

HTTP:/ /stackoverflow.com/q/7174277/ http://stackoverflow.com/q/822487/ http://stackoverflow.com/q/2371489/ http://stackoverflow.com/q/6139593/ http:// stackoverflow的.com /查询q =%5Bobjc%5D +下划线+属性&提交=搜索 – 2012-02-11 01:27:32

回答

6

模式@synthesize foo = bar;允许你定义它获取组合合成了名bar(或者,如果你想_foo)的实例变量键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 

的synthezised实例变量将在可以通过使用任一_fooself->_foo(其中前者实际上是一个隐式的形式),这将不涉及访问器方法调用什么。

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

只要想到@synthesize foo;作为隐含的(注意这里缺少一个_,等号)。

5

或多或少。在.H这些行声明两个所谓的窗口和控制公共变量的存在:

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

但这些线路只声明变量的存在,它们实际上并不创建它们。无论它是否需要实现这些,它都是由该类实现的 - 例如,它们可以是虚拟变量,但实际上并不存在,而是调用以编程方式创建数据的方法,或从数据库或其他东西中加载数据的方法。

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

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

这些行实际上说的是内部变量名是_window,但变量的公共名称是窗口。这意味着,在类中你可以这样

_window = something; 

直接访问变量,但外部您在使用

appDelegate.window = something; 

因为这是它的公共名称来访问它。你也可以使用self.window在内部访问它。

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

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

,您可以直接,如果你喜欢调用这些方法,使用

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