要了解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="https://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="https://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="https://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程序整个启动流程,如下图: