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

来源:互联网 发布:三端口环行器 编辑:程序博客网 时间:2024/05/16 17:43

一、程序的启动过程

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
原创粉丝点击