为什么不用self.window,为什么不使用_window

时间:2014-09-23 09:09:18

标签: objective-c iphone ios7

@interface Student
{
    UIWindow* _window;
}
@property (weak,readwrite) UIWindow *window;
@end

#import "Student.h"
@implementation Student
@synthesize window;

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

     [self.window makeKeyAndVisible];//here why self.window ,why not use _window

     [_window makeKeyAndVisible];  
}

这里,为什么self.window,为什么不使用_window ._window也包含*窗口然后为什么我们不使用_window在_window上调用makeKeyAndVisible消息。

2 个答案:

答案 0 :(得分:1)

代码:(Objective-C) @synthesize window = _window;

它表示为名为window的属性合成getter和setter,并将该属性与名为_window的实例变量相关联(不必在别处单独声明)。 Apple希望您通过合成的setter和getter设置和检索实例变量的值。也就是说,写下这样的东西:

代码:(Objective-C) [window makeKeyAndVisible];

将失败,因为没有名为window的实例变量。相反,您必须直接通过名称命名实例变量;即,

代码:(Objective-C) [_window makeKeyAndVisible];

或使用访问者方法:

代码:(Objective-C) [self.window makeKeyAndVisible];

现在,实例变量通常是私有的,这意味着子类不能直接按名称访问它们。因此,子类别无选择,只能使用继承的访问器方法来访问它们的值。请记住,合成方法可能会根据它们的属性(例如,保留,复制,非原子)进行额外的工作,这些属性在直接向/从实例变量分配或检索值时不会发生。因此,属性和实例变量之间存在额外的抽象级别。

答案 1 :(得分:0)

因为属性getter执行特殊功能而不仅仅是返回_window

来自here

  

如果您的应用的Info.plist需要实现此属性   file包含UIMainStoryboardFile键。幸运的是,Xcode   项目模板通常包括合成的声明   应用程序委托自动属性。默认值   合成属性为nil,这会导致app创建泛型   UIWindow对象并将其分配给属性。如果你想提供   您的应用程序的自定义窗口,您必须实现的getter方法   此属性并使用它来创建和返回自定义窗口。