iOS开发之UIApplication & UIWindow & 创建单例

UIApplication对象是应用程序的象征,每一个应用都有自己的UIApplication对象,而且是单例的。

UIApplication

  • UIApplication对象是应用程序的象征
  • 每一个应用都有自己的UIApplication对象,而且是单例的。
  • 通过[UIApplication sharedApplication]创建,创建单例基本以share开头
  • 一个iOS程序启动后创建的第一个对象就是UIApplication对象
  • 利用UIApplication对象,能进行一些应用级别的操作,如:
    • 设置提醒数字,得要注册用户通知
    • 可以设置联网状态:将NetworkActivityIndicatorVisible属性设为YES
    • 可以设置状态栏:默认控制器管理,要在info文件中设置修改然后调用
      setStatusBarHidden: withAnimation:方法
    • 可以打电话,发短信,打开网页:使用OpenURl方法
    • 代理方法:系统自动生成
1
2
3
4
5
6
7
   // 设置提醒数字
app.applicationIconBadgeNumber = 10;

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];

// 注册一个用户的通知
[app registerUserNotificationSettings:settings];

UIWindow

  • UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow
  • iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
  • 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow。也就说,没有UIWindow,就看不见任何UI界面。

自定义

  • 创建窗口,设置frame。
  • 添加子控件,一般把窗口的根控制器添加上去,通过设置rootViewController就可以把根控制器的view添加到窗口上。
  • 窗口显示。设置窗口的hiddle属性;应用程序是有主窗口,通常调用makeKeyAndVisible
  • 属性: windons属性,可以识别应用程序中哪些控件还是窗口,有一个比较特殊,状态栏。

window层级

  • window层级,alert(2000) > statusBar(1000) > normal(0)
  • UIWindowLevel 本质是CGFloat 相同level的可以进行加减运算,调整优先级。

单例实现

  • 不管怎么创建,只会分配一次内存
  • 整个app中,只会分配一次

仿苹果实现单例

  • .h文件
1
2
3
4
5
#import <Foundation/Foundation.h>

@interface Person : NSObject
+ (instancetype)sharedPerson;
@end
  • .m文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#import "Person.h"
// 1.程序一启动的时候就创建这个类的对象
// 2.不允许外界通过alloc,分配内存,只要一调用,就崩溃
@implementation Person

// 人的实例
static Person *_instance;

// 程序运行的时候就会加载类
+ (void)load
{
_instance = [[self alloc] init];
}
// exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'
+ (instancetype)alloc
{
if (_instance) {
// 崩溃
// 创建异常对象
NSException *excption = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance." userInfo:nil];
// 抛异常
[excption raise];
}
// super -> [NSObject alloc]
return [super alloc];
}

+ (instancetype)sharedPerson
{
return _instance;
}

@end
要不要鼓励一下😘