iOS 【应用程序app运行原理-UIApplication-AppDelegate.m-UIApplicationMain】

来源:互联网 发布:股市模拟交易软件 编辑:程序博客网 时间:2024/05/17 02:37

要了解iOS应用启动的原理,首先我们先要了解一个类,那就是 UIApplication。

重点标记的三句话着重理解一下:

①象征;②启动后创建的第一个对象;③应用级别操作

然后我们来看一下UIApplication的几个重要的功能。

在新建项目的时候,会出现这两个class文件:AppDelegate.h、AppDelegate.m

这是什么?之前转载过一个博客,下面我用自己的理解解释一下这两个文件。(非常重要)

先看一下两个class的代码:

////  AppDelegate.h//#import <UIKit/UIKit.h>#import <CoreData/CoreData.h>//遵守UIApplicationDelegate协议,AppDelegate类就是UIApplication的协议@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;- (void)saveContext;- (NSURL *)applicationDocumentsDirectory;@end

////  AppDelegate.m (只保留了重要部分)//#import "AppDelegate.h"@interface AppDelegate ()@end@implementation AppDelegate//程序启动完成调用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    NSLog(@"程序启动完成调用");        //提醒数字(下图有示例)    application.applicationIconBadgeNumber = 10;        //网络提醒(下图有示例)    application.networkActivityIndicatorVisible = YES;        //图一    //<img src="http://img.blog.csdn.net/20151128110835687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="447" width="711" alt="" />    //隐藏状态栏    application.statusBarHidden = YES;        //状态栏的样式    application.statusBarStyle = UIStatusBarStyleLightContent;        另外,我们需要注意的是,在AppDelegate.m中来管理状态栏的时候,需要将控制器管理状态关闭:(这里也要注意一下,这个操作只是对 “隐藏状态栏” 和 “状态栏的样式修改” 这两个操作有用。而 提醒数字 和 网络延迟提醒 这两个是无关的。一旦关闭,在ViewController.m内设置状态栏隐藏和状态栏样式都是无用的)    <img src="http://img.blog.csdn.net/20151128111322268?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="351" width="841" alt="" />    return YES;}//应用程序将要失去焦点(回到主界面,此时无法和当前run的程序交互)- (void)applicationWillResignActive:(UIApplication *)application {    NSLog(@"应用程序将失去焦点");}//进入到后台(比如说回到主界面,此时也是失去焦点)- (void)applicationDidEnterBackground:(UIApplication *)application {    NSLog(@"进入到后台");}//应用显示到前台(回到当前应用程序界面)- (void)applicationWillEnterForeground:(UIApplication *)application {    NSLog(@"应用显示到前台");}//程序获取焦点(意味着程序可以和用户交互)- (void)applicationDidBecomeActive:(UIApplication *)application {    NSLog(@"程序获取焦点");}//程序结束退出- (void)applicationWillTerminate:(UIApplication *)application {    NSLog(@"程序结束退出");//(程序退出时调用,但是这个NSLog是无法输出的。但不代表这个代理方法没有调用)    [self saveContext];//上面这几个都是程序启动过程中的一些代理方法,在整个过程中进行运行。比如说我们现在先启动一下这个程序,然后我们再退回到主界面。我们看一下这几个输出语句的输出顺序    //图二    //<img src="http://img.blog.csdn.net/20151128110856469?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="164" width="471" alt="" />}

上面的代码中有两个图没有显示,在这里补上:

图一:(提醒数字、网络延迟标识)



图二:(启动程序时NSLog验证语句)



另外给大家介绍一个方法:


在介绍一个UIApplicationMain,程序开始运行时最最开始是先进入到这个类中的:

如图:





总结一下iOS程序整个启动流程,如下图:

       


6 0
原创粉丝点击