ViewController = _ViewController含义

Dan*_*iel 6 iphone xcode objective-c

可能重复:
在Objective C中使用下划线前缀属性名称

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

@synthesize window = _window;
@synthesize viewController = _viewController;
Run Code Online (Sandbox Code Playgroud)

它说,在AppDelegate.h文件中

@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;
Run Code Online (Sandbox Code Playgroud)

我想知道究竟是什么意思,特别是合成部分.它是否实例化了一个本地私有变量?如果是这样,这与说@synthesize viewController有什么不同;

谢谢

Reg*_*ent 6

该模式@synthesize foo = bar;允许您定义key的属性,foo该属性与名称的实例变量bar(或者_foo如果需要)一起@synthesize foo;合成,同时简单地合成具有相同名称的属性和实例变量(foo即).

@property (...) Foo *foo;
@synthesize foo = _foo;
Run Code Online (Sandbox Code Playgroud)

有点像这样:

@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
Run Code Online (Sandbox Code Playgroud)

合成的实例变量将通过任一_fooself->_foo(其中前者实际上是隐式形式)使用,这将不涉及任何访问器方法调用.

虽然合成的属性将被使用self.foo,然后将使用对一个合成的存取方法的调用.

只是想到@synthesize foo;一个隐含的@synthesize foo = foo;(注意缺少一个_这里,相同的名字).


Nic*_*ood 5

或多或少..h中的这些行声明存在两个名为window和controller的公共变量:

@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;
Run Code Online (Sandbox Code Playgroud)

但是这些行只声明了变量的存在,它们实际上并没有创建它们.它可以由类来实现,但是它们可能是虚拟变量,例如,它们实际上并不存在,而是调用以编程方式创建数据的方法,或者从数据库或其他东西加载它.

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

@synthesize window = _window;
@synthesize viewController = _viewController;
Run Code Online (Sandbox Code Playgroud)

这些行实际上说的是内部变量名称是_window,但变量的公共名称是window.这意味着在类中,您可以通过说明直接访问变量

_window = something;
Run Code Online (Sandbox Code Playgroud)

但在外部你必须使用它来访问它

appDelegate.window = something;
Run Code Online (Sandbox Code Playgroud)

因为那是公共名称.您还可以使用self.window在内部访问该类.

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

- (void)setWindow:(UIWindow *)window; // to set the _window variable
- (UIWindow *)window; // to get the _window variable
Run Code Online (Sandbox Code Playgroud)

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

[self setWindow:someValue];
UIWindow *window = [self window];
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1108 次

最近记录:

14 年,1 月 前