iOS 启动的流程

请看时序图

Swift没有main函数是怎么启动的

在Objective-C的时候,有main主函数。但是在Swift中为啥就没有呢?
实际上是有的。AppDelegate.swift的注解@UIApplicationMain帮你实现了。在AppDelegate.swift > 的方法application(application: didFinishLaunchingWithOption:) -> Bool 打个断点,就可以看到堆栈里有main函数:

那么现在笔者注释掉@UIApplicationMain, 如下所示。

//
//  Created by zgpeace on 2020/4/25.
//  Copyright © 2020 zgpeace. All rights reserved.
//import UIKit//@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate ....

运行就会报错

ld: entry point (_main) undefined. for architecture x86_64

自定义main方法

新建类main.swift, 注意名字不能自定义。

//
//  main.swift
//  InitalFlowDemo
//
//  Created by zgpeace on 2020/4/25.
//  Copyright © 2020 zgpeace. All rights reserved.
//import UIKitUIApplicationMain(CommandLine.argc, UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)), nil, NSStringFromClass(AppDelegate.self))

运行成功:

Main Runloop

APP启动后,会启动main runloop进程,持续监控用户的行为。
事件处理的先进先出的队列FIFO。比如有如下顺序操作:

  1. [touch 1]
  2. [touch 2]
  3. [touch 3]
  4. [swipe 1]

事件队列如图:

事件被按照Main Run Loop处理

自定义事件接收CustomApplication

新建类CustomApplication

//
//  CustomApplication.swift
//  InitalFlowDemo
//
//  Created by zgpeace on 2020/4/25.
//  Copyright © 2020 zgpeace. All rights reserved.
//import UIKitclass CustomApplication: UIApplication {override func sendEvent(_ event: UIEvent) {print("Intercepted event \(event)")super.sendEvent(event)}
}

替换掉main实现的applicationnil改为NSStringFromClass(CustomApplication.self)

UIApplicationMain(CommandLine.argc, UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)), NSStringFromClass(CustomApplication.self), NSStringFromClass(AppDelegate.self))

点击看到把点击位置信息{226.5, 344}打印出来

Intercepted event <UITouchesEvent: 0x600002540000> timestamp: 515837 touches: {(<UITouch: 0x7fb9d70009d0> phase: Ended tap count: 1 force: 0.000 window: <UIWindow: 0x7fb9d5554650; frame = (0 0; 414 896); gestureRecognizers = <NSArray: 0x600001a0cb70>; layer = <UIWindowLayer: 0x600001402e60>> view: <UIView: 0x7fb9d70020e0; frame = (0 0; 414 896); autoresize = W+H; layer = <CALayer: 0x600001469360>> location in window: {226.5, 344} previous location in window: {226.5, 344} location in view: {226.5, 344} previous location in view: {226.5, 344}
)}

在事件监听的方法里打个断点,可以看到自定义CustomApplication类。事件相应是在主线程,并且主线程是在串行队列执行 Thread 1 Queue: com.apple.main-thread (serial)

代码下载

https://github.com/zgpeace/InitalSwiftFlowDemo

参考

https://www.linkedin.com/learning/ios-development-architecture/the-app-launch-sequence?u=2146730

Swift App启动干了什么事情, 删掉UIApplicationMain,自定义实现main类, Main Runloop相关推荐

  1. 分析启动耗时 android,Android app启动耗时分析

    首先编译你的程序,打开Android Studio里面的Android Monitor,找到下图的按钮 &amp;amp;amp;amp;amp;lt;img src="//bbsm ...

  2. 【单页应用】全局控制器app应该干些什么?

    前言 之前,我们形成了页面片相关的mvc结构,但是该结构还仅适用于view(页面)级,那么真正的全局控制器app应该干些什么事情呢?我觉得至少需要干这些: 功能点 ① 提供URL解析机制,以便让控制器 ...

  3. swift设置启动图不现实_如何通过装饰房屋来开始在Swift中使用增强现实

    swift设置启动图不现实 by Ranadhir Dey 由Ranadhir Dey 如何通过装饰房屋来开始在Swift中使用增强现实 (How to get started with augmen ...

  4. iOS App 启动优化

    简介: 作为程序猿来说,"性能优化"是我们都很熟悉的词,也是我们需要不断努⼒以及持续进⾏的事情:其实优化是⼀个很⼤的课题,因为细分来说的话有⼤⼤⼩⼩⼗⼏种优化⽅向 ,但是切忌在实际 ...

  5. iOS 15 如何让 App 启动更快?

    译者 | 无阻我飞扬     责编 | 晋兆雨 出品 | CSDN(ID:CSDNnews) WWDC21中最有趣的特性被深深地隐藏在 Xcode 13发布说明中: 部署在 macOS 12 或 iO ...

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

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

  7. 优化总结:有哪些APP启动提速方法?

    简介:APP 启动速度的重要性不言而喻.高德地图是一个有着上亿用户的超级 APP,本文从唤端技术.H5 启动页.下载速度.APP加载.线程调度和任务编排等方面,详解相关技术原理和实现方案,分享高德在启 ...

  8. 以高德为例,超级APP启动提速的实践和思考

    前言 启动是门面,好的印象也助于留存率提高.苹果也在系统启动上不断努力,提升用户体验,最新的 M1 宣传中还特别强调了翻盖秒开 macOS,可以看出其对极致启动速度的追求.这篇文章(https://f ...

  9. ios启动页尺寸_关于移动端App启动页的策划方案

    App启动页是指app在启东时需要加载必要的运行环境和配置,在这个过程中提示用户等待的一个过渡页面. 在产品经理眼里启动页是app给予用户重要的第一印象:也是App最重要的黄金页面之一,所有用户100 ...

  10. Android之ActivityManagerService详解(APP启动过程)

    转载请标明出处:[顾林海的博客] 前言 AMS(ActivityManagerService)的启动是在SystemServer进程中启动的,它的职责是用于和所有APP的四大组件进行通信,Activi ...

最新文章

  1. AttributeError: Cant get attribute SPPF on module models
  2. 北京联通限制上传到电信网络服务器
  3. 用C#实现win7下vs2008的激活(附学习交流代码)
  4. javascript 表达式和运算符 (二)
  5. SAP Spartacus user form页面的css设计重构
  6. 算法训练营 重编码_编码训练营后十四天如何找到工作
  7. var obj = eval(result); 解析json
  8. OpenCV(Open Source Computer Vision Library)简介
  9. SAR舰船检测的学习笔记
  10. secure CRT连接华三、华为模拟器
  11. java垃圾回收文件分析
  12. android仿饿了么购物车效果,仿饿了么购物车跳动
  13. 【CCF】小中大(C++)
  14. 【光学】基于matlab相互垂直的光波叠加仿真【含Matlab源码 2071期】
  15. springboot基于微信小程序的校园体育运动场地及器材租凭系统设计与实现毕业设计源码131052
  16. 数据分析师三个等级_数据分析课|这三个等级的数据分析师报考条件,一定是你需要的...
  17. 海康摄像头二次开发详解,包含海康摄像头登录、海康云台控制、视频下载等功能
  18. MySQL:由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可能会解决此问题
  19. Linux 性能分析命令详解
  20. Python金融大数据分析-BSM、Term Struc、Ho-Lee 与Vasicek模型路径仿真

热门文章

  1. python导入datetime模块_Python时间模块datetime用法
  2. imu 里程计融合_MSCKF那些事(十一)算法改进4:融合直接观测
  3. web文件服务器1台,WEB服务器及配件1台 - 千里马招标网
  4. apollo @value没生效_有Apollo,还用Archaius吗?
  5. 【转】CSS3学习笔记 之 动态伪类选择器
  6. Wordvec_句子相似度
  7. mysql之 mysql_config_editor/login-path 登录密码保护
  8. WPF备忘录(1)有笑脸,有Popup
  9. Linux中命令行终端切换工具screen
  10. HTTP 连接管理进化论