UIApplication.h 类中有
@property(class, nonatomic, readonly) UIApplication *sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead.");
注:
属性中的class修饰符: @property (class, nonatomic)
作用
给类增加一个属性。(其实就是给类增加了一个setting 和getter方法,+方法,注意没有生成实例变量,使用上相当于其类方法调用)
例如:[UIApplication sharedApplication],以下是自定义一个class修饰符的属性
@interface ClassProperty : NSObject
@property (class, nonatomic) NSString *name;
@end
#import "ClassProperty.h"
static NSString *_name = nil;
@implementation ClassProperty
//实现set 和 get方法
-(NSString *) name {
if(_name ==nil) {
_name = [NSString new];
}
return _name;
}
-(void) setName:(NSString*)name {
if(_name != name) {
_name = [name copy];
}
}
@end
window在UIApplication中的定义:
@interface UIApplication : UIResponder
@property(nullable, nonatomic, assign) id<UIApplicationDelegate> delegate;
@property(nonatomic,readonly) NSArray<__kindof UIWindow *> *windows;
@property(nullable, nonatomic,readonly) UIWindow *keyWindow API_DEPRECATED("Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes", ios(2.0, 13.0));
@end
@protocol UIApplicationDelegate<NSObject>
@property (nullable, nonatomic, strong) UIWindow *window API_AVAILABLE(ios(5.0));
@end
以下三个window的区别:
[UIApplication sharedApplication].delegate.window
[UIApplication sharedApplication].windows
[UIApplication sharedApplication].keyWindow
在执行 didFinishLaunchingWithOptions: 这个代理方法时,在执行
[self.window makeKeyAndVisible];
方法之前,通过
[UIApplication sharedApplication].keyWindow
方法获取不到window,且在执行
[UIApplication sharedApplication].keyWindow
之前是要执行rootviewcontroller的代码的,因此先执行了controller中的代码,但是在controller中我们发现,在viewWillAppear和viewDidLoad 中的keywindow也是nil,但是在直到viewWillLayoutSubviews时才有了keywindow的值。
但是无论何时都能获取到delegate.window。
delegate.window 程序启动时设置的window对象。
keyWindow 这个属性保存了[windows]数组中的[UIWindow]对象,该对象最近被发送了[makeKeyAndVisible]消息
一般情况下 delegate.window 和 keyWindow 是同一个对象,但不能保证keyWindow就是delegate.window,因为keyWindow会因为makeKeyAndVisible而变化,当有系统弹窗出现的时候,keyWindow就变成了另外一个对象。
所以 [UIApplication sharedApplication].keyWindow 会因为makeKeyAndVisible而变化
原文链接:https://blog.csdn.net/lyj861144636/article/details/112988600