@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消息。
答案 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方法 此属性并使用它来创建和返回自定义窗口。