【原】iOS学习之应用程序的启动原理
最近看视频了解了一下应用程序的启动原理,这里就做一个博客和大家分享一下,相互讨论,如果有什么补充或不同的意见可以提出来!
1、程序入口
众所周知,一个应用程序的入口一般是一个 main 函数,iOS也不例外,在工程的 Supporting Files 文件夹中你可以找到main.m,他就是程序的入口。
代码:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class]));
}
}
2、UIApplicationMain函数参数解析
UIApplicationMain 函数的声明:
// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.
int UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName);
第一个参数 argc 和 第二个参数 argv 为C语言的值,在这里可以不做考虑。
第三个参数 principalClassName:主程序类名,由英文注释可知,当值为 nil 时,默认使用的就是 UIApplication
第四个参数:delegateClassName:代理类名,在 iOS 中默认就是随工程一起创建出来的AppDelegate。
第四个参数的类型是一个字符串,但是在主函数却是 NSStringFromClass([AppDelegate class]) 。NSStringFromClass() 函数是将一个类名转为字符串的一种特殊转换函数,[AppDelegate class] 则是反射得到AppDelegate 对象的类名。
和 NSStringFromClass() 函数类似的一系列函数声明:
FOUNDATION_EXPORTNSString *NSStringFromSelector(SEL aSelector); // 函数名转字符串
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName); // 字符串转函数名 FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass); // 类名转字符串
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName); // 字符串转类名 FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0); // 协议名转字符串
FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0); // 字符串转协议名
3、UIApplicationMain底层实现
(1)根据 principalClassName 提供类名创建 UIApplication 对象
(2)创建 UIApplicationDelegate 对象,并且成为 UIApplication 对象代理,app.delete = delegate
(3)开启一个主运行循环,处理事件,可以保持程序一直运行。
(4)加载 info.plist,并且判断 Main Interface 有木有指定 main.storyboard,如果指定,就会去加载
(5)如果有指定,加载 main.stroyboard 做的事情
创建窗口,也就会说执行 AppDelegate 中的代理方法
加载 main.storyboard, 并且加载 main.storyboard 指定的控制器
把新创建的控制器作为窗口的跟控制器,让窗口显示出来
(6)如果没有指定,就在 AppDelegate 的代理方法 - (BOOL)application: didFinishLaunchingWithOptions:中创建一个UIWindow 对象作为主窗口
代码:
// 程序启动完成的时候
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. // 1.创建窗口,注意窗口必须要有尺寸,尺寸跟屏幕一样大的尺寸,窗口不要被释放
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor redColor]; // 2.创建窗口的根控制器
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor yellowColor]; [vc.view addSubview:[UIButton buttonWithType:UIButtonTypeContactAdd]]; // 如果设置窗口的跟控制器,默认就会把控制器的view添加到窗口上
// 设置窗口的跟控制器,默认就有旋转功能
self.window.rootViewController = vc; // 3.显示窗口
[self.window makeKeyAndVisible]; return YES;
}
图解:
官方帮助文档图解:
【原】iOS学习之应用程序的启动原理的更多相关文章
- iOS常见文件及程序的启动原理
一. iOS中常见文件 (一). Xcode6之前 创建项目,默认可以看见一个存放框架的文件夹 info文件以工程文件名开头,如:第一个项目-Info.plist 项目中默认有一个PCH文件 (二). ...
- iOS的常见文件及程序的启动原理
一. iOS中常见文件 (一). Xcode6之前 创建项目,默认可以看见一个存放框架的文件夹 info文件以工程文件名开头,如:第一个项目-Info.plist 项目中默认有一个PCH文件 (二). ...
- iOS程序的启动原理
一.在一些老的项目中,有很多不是通过代码添加窗口和跟控制器.是通过设置MainInterface(设置最主要的xib),在xib中通过图形化的操作设置应用程序的代理->设置窗口->设置根控 ...
- 【转载】Spring boot学习记录(三)-启动原理解析
前言:本系列文章非本人原创,转自:http://tengj.top/2017/04/24/springboot0/ 正文 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @Sprin ...
- 学习微信小程序之css17clearfix原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android启动原理剖析
我们知道Android是以一个Activity为单位的,可是我们并没有看到一个Activity是怎么開始启动的. 今天我 们就从Android的源码開始讲吧. ActivityThread: Andr ...
- iOS开发UI篇—程序启动原理和UIApplication
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- iOS开发UI篇—程序启动原理和UIApplication1
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- 【转】iOS开发UI篇—程序启动原理和UIApplication
原文 http://www.cnblogs.com/wendingding/p/3766347.html 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程 ...
随机推荐
- 学习.Net的经典网站
学习.Net的经典网站 收藏 还不错推荐给大家 原文-- 名称:快速入门 地址:http://chs.gotdotnet.com/quickstart/ 描述:本站点是微软.NET技术的快速入门网站, ...
- Python之路Python3【第零篇】Python2 & Python3区别持续更新~
print def print(self, *args, sep=' ', end='\n', file=None): # known special case of print "&quo ...
- 深入理解javascript原型和闭包(4)——隐式原型
注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...
- codevs2572 路面修整
题目描述 Description Mr. Ling打算好好修一下学校门口的那条凹凸不平的路.按照Mr. Ling的设想,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同 ...
- asp.net数据控件遍历 获取当前索引
Gridview 数据访问遍历1.for遍历for (int i = 0; i <= GridView1.Rows.Count - 1; i++)//为gv的每一行增加js事件{ TextB ...
- JavaScript方法call、apply、caller、callee、bind的使用详解及区别
一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). 即 “某个方法”当做“指定的某个对象”的“方法”被执行. Js代 ...
- 【Android学习】android布局中几个距离单位的区别:px、dp、sp
一.px 像素,我们经常说的400*800这种的就是像素,这个比较好理解. 二.dp 要理解dp,首先要先引入dpi这个概念,dpi全称是dots per inch,对角线每英寸的像素点的个数,所以, ...
- HTML5CSS3特效-上下跳动的小球-遁地龙卷风
(-1)写在前面 我用的是chrome49,这个idea是我在stackoverflow上回答问题时看到了,多谢这位同行,加深了我对很多技术点的理解,最近刚到北京,忙碌了一两天,在后续的日子里,会被安 ...
- redmine问题集锦
当我新建LDAP认证模式时,遇到如下错误:
- Unity3D NGUI刮刮卡效果
线上效果 确保你的纹理的read/write 是勾选的,纹理格式是 RGBA32的 //代码 using UnityEngine; [RequireComponent(typeof(UITexture ...