最近看了些Runtime Runloop的一些知识.边看边摸索.看到群里有人在问 一些面试题.其中就提到了app的启动流程.

所以这里也研究小结一下,以供自己学习备用.

1.项目要运行,就要有入口. OC语言的入口就在main.m 文件.下面看main.m里都有什么可以窥探的.

int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

在自动释放池里我们可以看到里面就一行代码

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

这行代码我们手打一下.可以看到传的参数

UIApplicationMain(<#int argc#>, <#char * _Nonnull * _Null_unspecified argv#>, <#NSString * _Nullable principalClassName#>, <#NSString * _Nullable delegateClassName#>)

下面我们一步步解析这句关键的代码如何启动App

UIApplicationMain 就是OC的入门点. 里面传递了四个参数:

argc 是一个int参数

argv 是一个char 参数

principalClassName 主程序类名( 当值为 nil 时,默认是UIApplication)

delegateClassName 代理类名 默认就是常见的AppDelegate类

在上面的传参时候用到了NSStringFromClass 方法.

NSStringFromClass 是将类名转化为字符串的转化函数.与此类似的还有字符串转化类名的NSClassFromString.

2.设定了对象和代理之后就是NSRunloop 来保持程序一直运行处理事件(详情请看上一篇说的runloop文章)

3.接下来就是info.plist文件.检查是否通过main.storyboard加载指定的控制器. 把新创建的控制器作为窗口的跟控制器,让窗口显示出来.如果没有则会在下面方法中创建UIWindow 来作为主窗口

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//创建UIWindow 来作为主窗口

return YES;

}

4.最后通过执行程序AppDelegate的代理.程序完成启动

iOS app启动流程的更多相关文章

  1. 马蜂窝 iOS App 启动治理:回归用户体验

    增长.活跃.留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能.启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率.因此,确保启 ...

  2. iOS App上架流程(2016详细版)

    iOS App上架流程(2016详细版) 原文地址:http://www.jianshu.com/p/b1b77d804254 感谢大神整理的这么详细 一.前言: 作为一名iOSer,把开发出来的Ap ...

  3. 20个可以帮你简化iOS app开发流程的工具

    这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是 ...

  4. Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

    1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation. ...

  5. 女儿拿着小天才电话手表问我App启动流程

    前言 首先,new一个女儿, var mDdaughter = new 女儿("6岁","漂亮可爱","健康乖巧","最喜欢玩小天 ...

  6. IOS (APP 启动 相应处理)

    APP 每次启动的入口都是通过: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSD ...

  7. iOS App 启动性能优化

    1. App启动过程 解析Info.plist 加载相关信息,例如如闪屏 沙箱建立.权限检查 Mach-O加载 如果是胖二进制文件,寻找合适当前CPU类别的部分 加载所有依赖的Mach-O文件(递归调 ...

  8. iOS App上架流程(2016详细版)来源DeveloperLY

    一.前言: 作为一名iOSer,把开发出来的App上传到App Store是必要的.下面就来详细讲解一下具体流程步骤. 二.准备: 一个已付费的开发者账号(账号类型分为个人(Individual).公 ...

  9. iOS 程序启动流程

    iOS程序启动原理   技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong   iOS应用程序运行 ...

随机推荐

  1. Confluence 6 自定义主面板

    主面板(dashboard)是你 Confluence 站点的默认载入页面.这个页面能够给用户能够找到其他页面的所有必须的工具,重新进入未完成的工作或者快速导航到喜欢的空间和页面 站点的欢迎信息将会在 ...

  2. 【Linux】安装多个JDK并切换

    一.JDK安装1.将安装包jdk-8u111-linux-x64.tar.gz拷贝到安装目录(如/usr/java)下.2.添加可执行权限chmod +x jdk-8u111-linux-x64.ta ...

  3. jsp 标签文件

    一. tag file 简介 tag file从两个方面简化了自定义标签的开发.首 先,tag file无须提前编译,直到第一次被调用才会编 译.除此之外,仅仅使用JSP语法就可以完成标签的扩 展定义 ...

  4. mysql 各种关系代数的使用

    连接(JOIN) 选择运算表示为: R⋈S ,其中R和S为不同的两个关系 连接运算是选取两个指定关系中的属性满足给定条件的元祖连接在一起来组成一个新的关系 数学形式: JOIN 关系名1 AND 关系 ...

  5. Nginx详解八:Nginx基础篇之Nginx请求限制的配置语法与原理

    Nginx的请求限制: 连接频率的限制:limit_conn_module 配置语法:limit_conn_zone key zone=name:size;默认状态:-配置方法:http 配置语法:l ...

  6. 第四周学习总结-HTML

    2018年8月5日 这是暑假第四周,这一周我在菜鸟教程网学到了许多HTML的知识.HTML编写网页不像C语言.Java语言那必须有主方法.主函数什么的,它基本上都是标签(元素),但是它可以与CSS(层 ...

  7. MySQL架构及SQL语句

    MySQL基础: 单进程多线程: 用户连接:连接线程 官方组件架构: MySQL的数据文件类型: 数据文件.索引文件 重做日志.撤销日志.二进制日志.错误日志.查询日志.慢查询日志.中继日志 MySQ ...

  8. SVN重新设置用户名和密码

    在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了. 不过,如果 ...

  9. Eclipes导入工程

    1.在eclipes中导入其他的一些工程后往往会出错,修改意见是 在project.properties该文件下修改 这个target是你的sdk中已经下载好的 查看: 右键目标工程,选择proper ...

  10. 步步为营-90-SEO(url重写+超链接技巧)

    目的:便于搜索引擎抓取 url重写:将带参数的url如:https://i.cnblogs.com/EditPosts.aspx?opt=1.修改为https://i.cnblogs.com/Edit ...