可能重复:
Prefixing property names with an underscore in Objective C
我刚开始iphone开发,注意到当您生成一个新项目时,下面的代码可以在AppDelegate.m中看到
@synthesize window = _window;
@synthesize viewController = _viewController;在AppDelegate.h文件中写着
@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;我只想知道这到底意味着什么,特别是合成部分。它是否实例化局部变量?如果是这样的话,这和说“合成viewController”有什么区别?
谢谢
发布于 2012-02-10 22:17:20
模式@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综合实例变量将通过_foo或self->_foo (前者实际上是一个隐式)使用,这将不涉及任何访问器方法调用。
而合成的属性将通过self.foo使用,后者将利用对合成访问器方法之一的调用。
只需将@synthesize foo;看作一个隐式@synthesize foo = foo; (注意这里缺少一个_,同名)。
发布于 2012-02-10 22:23:49
或多或少。.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的另一个有趣的事实是,使用点语法以这种方式访问变量实际上只是调用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];https://stackoverflow.com/questions/9235556
复制相似问题