程序启动及程序的生命周期

一、程序的启动过程

1.程序一启动是先要进入main函数的,main函数是程序的默认入口。

/**
 *  程序的入口函数
 */
int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        /**
         *  此函数会创建一个隐式的application对象
         *
         *  @param argc   用户传入的参数个数
         *  @param argv   封装了用户传入的多个参数
         *  @param nil    应用程序类,传nil表示用系统默认的应用程序类
         *  @param class 应用程序类的代理类 可以自定义 比如:[MYAppDelegate class]
         */
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

PS;

在这个方法里主要完成以下事情

1.

创建UIApplication对象

创建Appdelegate对象,并且成为UIApplication对象的代理属性。

开启主运行循环:目的让程序一直跑起来,监听用户操作和相应事件的调度。主运行循环一旦进入就会创建自动释放池。

加载info.plist文件,判断下info.plist文件里面指定的内容。

假如info.plist里指定了main.storyboard加载main.storyboard。

2-1:指定了main.storyboard的情况


先初始化窗口UIWindow。

然后加载storyboard文件,创建箭头指定的控制器。

把新创建的控制器作为窗口的根控制器,让窗口实现。

类似下面的实现的代码:

UIStoryboard* story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
[story instantiateInitialViewController];
//启动完毕之后调用下面的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullableNSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);

2-2:没有指定main.storyboard的情况


//启动完毕之后调用下面的方法
//需要在这个方法里指定窗口和窗口的根控制器。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
启动过程如下:


二、application对象的代理对象

#import "AppDelegate.h"
#import "MYViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface AppDelegate ()

@property (nonatomic, strong) AVAudioPlayer *player;

@end

@implementation AppDelegate

/**
 *  应用程序一共包括如下几种状态
 1、not running 未运行
 2、Inactive 未活动 不接受触碰事件
 3、active 活动 这是在前台时所处的正常状态
 4、Background 后台 
 5、Suspended 挂起
 *
 */

#pragma mark - 程序启动时调用
//1、应用程序将要启动时自动调用该方法,该方法是应用程序启动时第一次执行自定义代码的机会
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    //检测应用程序的状态
    /**
     *
     typedef NS_ENUM(NSInteger, UIApplicationState) {
     UIApplicationStateActive,//活动状态
     UIApplicationStateInactive,//未活动状态
     UIApplicationStateBackground//后台状态
     } NS_ENUM_AVAILABLE_IOS(4_0);
     *
     */
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    NSLog(@"1state = %ld",(long)state);
    
    
    
    
    return YES;
}

//2、应用程序启动时自动调用该方法,开发者可以在该方法中执行初始化相关的代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    /**
     *  检测应用程序的状态
     */
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    NSLog(@"2state = %ld",(long)state);
    
    //如果不指定storyboard文件的话就没有window对象和根视图控制器 需要在这里创建
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    //创建根控制器,实际开发中还需要标签控制器绑定导航控制器,导航控制器绑定视图控制器
    MYViewController * vc = [[MYViewController alloc] init];
    self.window.rootViewController = vc;
    //设置并显示主window
    [self.window makeKeyAndVisible];
    return YES;
}

#pragma mark - 程序进入前台时调用
//3、应用在转入前台并进入活动状态时调用该方法,可重写该方法执行最后的准备工作(启动--前台   后台--前台)
- (void)applicationDidBecomeActive:(UIApplication *)application {
    /**
     *  检测应用程序的状态
     */
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    NSLog(@"3state = %ld",(long)state);
    
}

#pragma mark - 程序将要从前台离开
//4、应用正要从前台运行状态离开时将会调用该方法
- (void)applicationWillResignActive:(UIApplication *)application {
    /**
     *  检测应用程序的状态
     */
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    NSLog(@"4state = %ld",(long)state);
    
    
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"后台播放.mp3" withExtension:nil];
    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    [player prepareToPlay];
    // 无限播放
    player.numberOfLoops = -1;
    _player = player;
    //进入后台播放
    [player play];
}

//5、应用来到Background状态,且随时可进入Suspended状态时将会调用该方法
- (void)applicationDidEnterBackground:(UIApplication *)application {
    /**
     *  检测应用程序的状态
     */
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    NSLog(@"5state = %ld",(long)state);
    
}

#pragma mark - 程序从后台进入前台时调用
//6、程序正从后台转入前台(启动时不会调用)运行状态,但暂时还没有达到Active状态时将会调用该方法
- (void)applicationWillEnterForeground:(UIApplication *)application {
    /**
     *  检测应用程序的状态
     */
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    NSLog(@"6state = %ld",(long)state);
    
    //进入前台停止播放
    [_player stop];
}

#pragma mark - 程序停止时调用
//7、应用程序将要被终止时调用该方法,如果应用当前处在Suspended状态,此方法将不会被调用
- (void)applicationWillTerminate:(UIApplication *)application {
    /**
     *  检测应用程序的状态
     */
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    NSLog(@"7state = %ld",(long)state);
}

@end



参考文章:

1、UIApplication深入研究 - pengyingh - 博客园

2、iOS中的程序的五种状态 - [[XXXXalloc]init] - 博客园


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值