iOS-程序启动原理
2016-01-16 22:41
330 查看
app的启动顺序对于我们理解项目有着十分重要的作用,下面这张图可以从大体上看出程序的启动过程:
由上图可以看出,当我们打开程序时,首先会执行main函数(这是任何程序的入口),接着执行UIApplicationMain函数,在这个函数中系统会默认做两件事情:创建UIApplication对象和给UIApplication设置代理对象,紧接着会开启事件循环,UIApplicationDelegate对象会监听系统事件,当监听到对应的事件时代理对象就会调用对应的方法。
在上面的程序启动原理中涉及到几个对象,我们就详细说说其作用:
1.UIApplication对象
UIApplication对象是代表着本应用程序,是单例对象。当程序启动后第一个新建的对象就是UIApplication对象,利用该对象能够做一些应用级别的操作。
* 设置应用右上角的信息条数
* 联网操作时,状态栏上的等待图标指示器(旋转小菊花)
* 通过URL打开一些资源
* 管理状态栏
这些功能的简要一些属性和方法:
2.UIApplication的代理对象
当app都到干扰时,会产生一系列系统事件,这时UIApplication便会通知它的代理对象,让它的代理对象处理这些事情:
**应用程序的生命周期事件(如程序启动和关闭)
**系统事件(如来电)
**内存警告
3. UIApplicationMain函数介绍。
/**
方法名:
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
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.四大对象关系图
由上图可以看出,当我们打开程序时,首先会执行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.四大对象关系图
相关文章推荐
- iOS视图控制器总结
- iOS移动开发多线程—GCD介绍
- IOS中Label,imageView,view,button怎么添加边框?
- iOS 自定义九宫格
- iOS 文字动画,文字逐个显示
- ios学习day—1
- iOS截屏“闪现效果实现”
- ios如何处理声音
- iOS开发检测项目中哪个库包含了idfa
- iOS学习之路-超级猜图
- iOS 【Multithreading-GCD 同步/异步函数 和 串行/并发队列 的6种搭配使用及介绍】
- iOS盲人模式小结
- iOS调试Bug方式之——NSZombieEnabled(僵尸模式)
- GLKit Framework 浅析
- iOS:获取图片Alpha图片
- ios之TableViewCell重用机制避免反复显示问题
- ios 常见错误整理 持续更新
- ios nsnumber怎么转换成nsstring
- 苹果审核通过后包体大了200多MB!都是Xcode 7的错?
- iOS之 json数据解析