Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone ViewController=\u ViewController含义_Iphone_Objective C_Xcode - Fatal编程技术网

Iphone ViewController=\u ViewController含义

Iphone ViewController=\u ViewController含义,iphone,objective-c,xcode,Iphone,Objective C,Xcode,可能重复: 我刚开始iphone应用程序开发,注意到当您生成一个新项目时,可以在AppDelegate.m中看到以下代码 @synthesize window = _window; @synthesize viewController = _viewController; 在AppDelegate.h文件中 @property (strong, nonatomic) UIWindow window; @property (strong, nonatomic) ViewController c

可能重复:

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

@synthesize window = _window;
@synthesize viewController = _viewController;
在AppDelegate.h文件中

@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;
我只想知道这到底意味着什么,特别是合成部分。它是 实例化局部私有变量?如果是这样的话,这与说 @综合视图控制器


谢谢

模式
@synthesis foo=bar
允许您定义key
foo
的属性,该属性与name
bar
(或
\u foo
,如果需要)的实例变量组合合成,而
@synthesis 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
综合实例变量将通过
\u foo
self->\u foo
使用(前者实际上是隐式形式),这将不涉及任何访问器方法调用

而synthezized属性将通过
self.foo
使用,后者将利用对其中一个合成访问器方法的调用


想想
@syntheticfoo
作为隐式的
@synthesis foo=foo
(注意这里没有相同的名称)。

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

@property (strong, nonatomic) UIWindow window;
@property (strong, nonatomic) ViewController controller;
但是这些行只声明变量的存在,实际上并没有创建它们。这取决于类如何实现它们——例如,它们可以是虚拟变量,实际上并不存在,但可以调用以编程方式创建数据的方法,或者从数据库或其他地方加载数据

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

@synthesize window = _window;
@synthesize viewController = _viewController;
这些行实际上说的是内部变量名是_window,但变量的公共名是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];
[self setWindow:someValue];
UIWindow *window = [self window];