iOS 中的window

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 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

@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

你可能感兴趣的:(iOS 中的window)