2. iOS程序的生命周期

时间:2023-03-08 19:24:38

程序启动-生命周期

来自:  QQ: 853740091

1.首先讲解UIApplication对象

(1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序。

(2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示。

(3)通过[UIApplicationsharedApplication]可以获得这个单例对象

(4) 一个iOS程序启动后创建的第一个对象就是UIApplication对象,且只有一个(通过代码获取两个UIApplication对象,打印地址可以看出地址是相同的)。

(5)利用UIApplication对象,能进行一些应用级别的操作

1.1 应用级别的操作示例:

1)设置应用程序图标右上角的红色提醒数字(如QQ消息的时候)

2)设置app联网时候的加载小菊花

3)管理状态栏 就是app最上边的信号等

4)openURL: 最常用的点击一个按钮跳到app stroe的下载界面、还有发短信、发邮件等

UIApplication对象会不断的检测应用程序的当前状态。当系统修改了应用程序的当前状态,会发送通知,UIApplication对象就会检测到这个通知。

2. UIApplication Delegate

2.1.简单说明

所有的移动操作系统都有个致命的缺点:app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终止。还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件。

每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理 遵守协议<UIApplicationDelegate>
2. iOS程序的生命周期

2.2 代理方法

// 当应用程序启动完毕的时候就会调用(系统自动调用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"didFinishLaunchingWithOptions");
return YES;
}

// 即将失去活动状态的时候调用(失去焦点, 不可交互)
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"ResignActive");
}

// 重新获取焦点(能够和用户交互)
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"BecomeActive");
}

// 应用程序进入后台的时候调用
// 一般在该方法中保存应用程序的数据, 以及状态
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"Background");
}

// 应用程序即将进入前台的时候调用
// 一般在该方法中恢复应用程序的数据,以及状态
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"Foreground");
}

// 应用程序即将被销毁的时候会调用该方法
// 注意:如果应用程序处于挂起状态的时候无法调用该方法
- (void)applicationWillTerminate:(UIApplication *)application
{
}

// 应用程序接收到内存警告的时候就会调用
// 一般在该方法中释放掉不需要的内存
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
NSLog(@"MemoryWarning");
}

3. 程序启动原理

int main(int argc, char * argv[]) {

@autoreleasepool {

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

}

}

int argc, char * argv[]  这两个参数包含应用程序何时启动等信息(系统传入的参数)

@autoreleasepool 缓存池,对象引用计数自动处理器 新生成一个Run Loop的时候,系统会自动的创建一个NSAutoreleasePool,该NSAutoreleasePool无法被删除

第三个参数:主要是检测程序的状态(指的是系统改变了程序的当前状态)的改变。必须传入UIApplication子类,如果传入nil系统会自动创建一个UIApplication对象

第四个参数:app程序的代理。第三个参数检测到程序状态的改变,就会通知代理。。然后我们在相应的方法中处理事情。

注意: 程序退出时 main函数才会返回。否则一个处于一个死循环状态

2. iOS程序的生命周期

4.程序启动的完整过程

1).main函数

2).UIApplicationMain

* 创建UIApplication对象

* 创建UIApplication的delegate对象

3).delegate对象开始处理(监听)系统事件(没有storyboard)

* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

* 在application:didFinishLaunchingWithOptions:中创建UIWindow

* 创建和设置UIWindow的rootViewController

* 显示窗口

4).根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

* 创建UIWindow

* 创建和设置UIWindow的rootViewController

* 显示窗口