您的位置:首页 > 移动开发 > IOS开发

iOS-程序启动原理

2016-01-16 22:41 330 查看
app的启动顺序对于我们理解项目有着十分重要的作用,下面这张图可以从大体上看出程序的启动过程:



由上图可以看出,当我们打开程序时,首先会执行main函数(这是任何程序的入口),接着执行UIApplicationMain函数,在这个函数中系统会默认做两件事情:创建UIApplication对象和给UIApplication设置代理对象,紧接着会开启事件循环,UIApplicationDelegate对象会监听系统事件,当监听到对应的事件时代理对象就会调用对应的方法。

在上面的程序启动原理中涉及到几个对象,我们就详细说说其作用:

1.UIApplication对象

UIApplication对象是代表着本应用程序,是单例对象。当程序启动后第一个新建的对象就是UIApplication对象,利用该对象能够做一些应用级别的操作。

* 设置应用右上角的信息条数

* 联网操作时,状态栏上的等待图标指示器(旋转小菊花)

* 通过URL打开一些资源

* 管理状态栏

这些功能的简要一些属性和方法:

@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; // 小菊花
@property(nonatomic) NSInteger applicationIconBadgeNumber;  // 右上角的信息条数,iOS8之后系统要求设置通知的时候必须经过用户认可
@property(readonly, nonatomic) UIStatusBarStyle statusBarStyle; //状态栏的模式
@property(readonly, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden; // 是否隐藏状态栏
- (BOOL)openURL:(NSURL*)url ; // 打开一些资源

设置右上角信息条数的代码
UIApplication *app =[UIApplication sharedApplication];
// 1.设置应用右上角的信息提示条数
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[app registerUserNotificationSettings:settings];
app.applicationIconBadgeNumber = 90;
}

简单实现几个打开资源的方法:
UIApplication *app = [UIApplication sharedApplication];
** 打开一个网页:
[app openURL:[NSURL URLWithString:@"http://ios.icast.cn"]];
** 打电话
[app openURL:[NSURL URLWithString:@"tel://10086"]];
** 发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];
** 发邮件
[app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];
** 使用openURL方法也可以打开其他应用,在不同应用之间互相调用对方。


2.UIApplication的代理对象

当app都到干扰时,会产生一系列系统事件,这时UIApplication便会通知它的代理对象,让它的代理对象处理这些事情:

**应用程序的生命周期事件(如程序启动和关闭)

**系统事件(如来电)

**内存警告

3. UIApplicationMain函数介绍。

/**

方法名:

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

参数介绍:
argc:使用main函数的argc即可
argv:使用main函数的argv即可
principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类),如果为nil,则用UIApplication类作为默认值
delegateClassName:指定应用程序的代理类,UIApplicationDelegate协议中定义的方法,在该类中实现.

UIApplicationMain函数会:
1> 根据principalClassName创建UIApplication对象
2> 根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性


4.程序的启动全过程

一、 有storyboard文件

1. 调用main函数

2. 调用UIApplicationMain函数

3. 创建UIApplication对象 、 AppDelegate对象

4. 设置UIApplicatio对象的代理是AppDelegate对象。

5. AppDelegate对象开始监听”系统事件(应用程序的事件)”,进入”事件循环”

6. 程序启动完毕后调用 application: didFinishLaunchingWithOptions:方法。

7. 在application: didFinishLaunchingWithOptions:方法中自动创建

* UIWindow对象。

* 根据Info.plist文件配置(Main Interface),找到需要加载的storyboard文件(Main.storyboard)

* 找到Main.storyboard中的Is Initial View Controller 对应的控制器类, 创建该控制器对象。

* 根据storyboard中的配置, 创建控制器对应的view。

* 设置UIWindow的根控制器(rootViewController)为刚才创建的控制器。

* 显示UIWindow([self.window makeKeyAndVisible])。

二、 没有storyboard文件

1. 调用main函数。

2. 调用UIApplicationMain函数。

3. 创建UIApplication对象 、 AppDelegate对象

4. 设置UIApplicatio对象的代理是AppDelegate对象。

5. AppDelegate对象开始监听”系统事件(应用程序的事件)”,进入”事件循环”。

6. 程序启动完毕后调用 application: didFinishLaunchingWithOptions:方法。

7. 在application: didFinishLaunchingWithOptions:方法中手动创建:

* UIWindow

* 控制器

* 设置UIWindow的根控制器是刚才创建的控制器

* 显示UIWindow

5.四大对象关系图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: