iOS程序启动顺序

iOS程序启动顺序

1 程序入口
进入main函数 设置AppDelegate成为函数的代理
2 程序完成加载
[AppDelegate application:didFinishLaunchingWithOptions:]
3 创建Window窗口
4 程序被激活
[AppDelegate applicationDidBecomeActive:]
5 进入后台
5-1 程序取消激活状态
[AppDelegate applicationWillResignActive:]
5-2 程序进入后台
[AppDelegate applicationDidEnterBackground:]
6 点击进入工程
6-1 程序进入前台
[AppDelegate applicationWillEnterForeground:]
6-2 程序被激活
[AppDelegate applicationDidBecomeActive:]

对于applicationWillResignActive(非活动的)和applicationDidEnterBackground(后台的)区别
applicationWillResignActive(非活动的)
比如有短信或者电话或者锁屏的时候 这时候程序进入非活动状态 也就是手机界面还是你当前应用程序的窗口 只不过被别的应用占用了 也可能是即将进入后台的状态(因为要先进入非活动状态 再进入后台)
applicationDidEnterBackground(后台的)
是指当前的窗口不是你的App 大多数程序进入后台在这个状态需要停留一会 到挂起状态(suspended) 如果程序处理 可以长期进入后台状态 比如后台定位 网络电话等
suspended(挂起)
程序进入后台不能执行代码 系统自动会执行这个状态 而且不会发通知 当挂起时 程序还在内存中 当系统内存低的时候 系统就会把挂起的程序清除掉 为前台提供更多的内存

UIApplicationMain函数解释
 

int main(int argc, char * argv[]) {  
      @autoreleasepool {  
          return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));    
    } 
}

 UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

argc和argv是为了和C语言保持一致
principalClassName 主要类名  delegateClassName 代理类名
如果principalClassName设置为nil 它就会从info.plist文件里面取 如果info.plist文件没有 默认就是UIApplication 只负责监听程序的生命周期 他只负责监听 剩下的交给delegateClass
delegateClass将在工程新建时 实例化对象
 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"--- %s ---",__func__);//__func__打印方法名
    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
     NSLog(@"--- %s ---",__func__);
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
   NSLog(@"--- %s ---",__func__);
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
   NSLog(@"--- %s ---",__func__);
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
  NSLog(@"--- %s ---",__func__);
}


- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
     NSLog(@"--- %s ---",__func__);
}

- (void)applicationWillTerminate:(UIApplication *)application {
    NSLog(@"--- %s ---",__func__);
}

打印调用顺序
启动程序

 --- -[AppDelegate application:didFinishLaunchingWithOptions:] ---
 --- -[AppDelegate applicationDidBecomeActive:] ---

进入后台

--- -[AppDelegate applicationWillResignActive:] ---
--- -[AppDelegate applicationDidEnterBackground:] ---

进入程序

--- -[AppDelegate applicationWillEnterForeground:] ---
--- -[AppDelegate applicationDidBecomeActive:] ---

内存警告

--- -[AppDelegate applicationDidReceiveMemoryWarning:] ---

分析
1 [AppDelegate application:didFinishLaunchingWithOptions:]
程序完成启动的时候执行 一般会在这个函数创建window 呈现给客户

2 [AppDelegate applicationWillResignActive:](非活动的)
程序将要失去active调用 比如有电话进来等
该函数执行
暂时正在执行的任务
禁止计时器
游戏暂停

3 [AppDelegate applicationDidEnterBackground:] (已经进入后台)对应的是 [AppDelegate applicationDidBecomeActive:](已经进入前台)

1 释放共享资源
2 保存用户数据
3 作废定时器

4 [AppDelegate applicationWillEnterForeground:]即将进入前台 对应的是 [AppDelegate applicationWillResignActive:] 即将进入后台

5 [AppDelegate applicationDidBecomeActive:]已经进入前台 对应的是 [AppDelegate applicationDidEnterBackground:]已经进入后台

6 [AppDelegate applicationDidReceiveMemoryWarning:]
程序即将退出时调用 需要保存数据

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值