深入解析 iOS 应用启动过程:main() 函数前的四大步骤

深入解析 iOS 应用启动过程:main() 函数前的四大步骤

在这里插入图片描述

背景描述:使用 Objective-C 开发的 iOS 或者 MacOS 应用

在开发 iOS 应用时,我们通常会关注 main() 函数及其之后的执行逻辑,但在 main() 函数之前,系统已经为我们完成了许多重要的初始化工作。这些工作确保了我们的应用能够顺利启动和运行。本文将详细解析在 main() 函数执行前,iOS 系统所做的四大步骤。

步骤一:加载可执行文件

当我们启动一个 iOS 应用时,系统首先会加载应用的可执行文件。可执行文件是由多个目标文件(.o 文件)链接而成的。这一步骤确保应用的核心代码和数据已经加载到内存中,准备好供后续使用。

步骤二:加载动态链接库,进行 Rebase 和 Bind

在加载可执行文件之后,系统会加载应用依赖的所有动态链接库(动态库或框架)。这一步骤包括两个重要的操作:

  1. Rebase(指针重定位):调整动态库在内存中的基地址,以确保所有内存引用都是正确的。
  2. Bind(符号绑定):解析和绑定所有符号(函数和全局变量的地址),以便在运行时可以正确调用这些符号。

通过这一步骤,系统确保所有外部依赖都已正确加载,并且符号地址已经绑定好,为后续的代码执行做好准备。

步骤三:Objective-C 运行时的初始处理

接下来,Objective-C 运行时会进行一系列初始化处理,包括:

  1. 类的注册:注册所有的 Objective-C 类,使其在运行时可用。
  2. Category 注册:注册所有的 Category,确保它们的方法被正确添加到相应的类中。
  3. Selector 唯一性检查:确保每个 Selector 在应用中是唯一的,避免方法调用冲突。

这些初始化处理确保了 Objective-C 运行时环境的正确性和稳定性。

步骤四:初始化工作

最后一步是各种初始化工作,按照实际执行顺序,如下所述:

  1. 调用用 attribute((constructor)) 修饰的函数
    这些函数会在加载动态链接库并进行基本内存布局之后首先被调用。这些函数用于执行早期的初始化操作。

  2. 执行类和 Category 的 +load 方法
    接下来,Objective-C 运行时会执行所有类和 Category 的 +load 方法。+load 方法在类或 Category 被加载到运行时时调用,用于执行类级别的初始化操作。需要注意的是,+load 方法的调用顺序是按照类和 Category 的加载顺序,父类的 +load 方法会先于子类的 +load 方法执行。

  3. 初始化和创建全局变量
    最后,系统会初始化和创建全局变量。这包括全局 C++ 对象的构造函数调用和全局 Objective-C 对象的初始化。这些变量的初始化通常会在 +load 方法之后进行,因为全局变量的初始化可能依赖于类的加载和初始化。

通过上述四个步骤,iOS 系统为我们的应用创建了一个稳定的运行环境,使得应用可以顺利地从 main() 函数开始执行主逻辑。

总结

在这里插入图片描述

main() 函数执行之前,iOS 系统进行了许多关键的初始化工作。这些工作包括加载可执行文件和动态链接库、进行 Objective-C 运行时的初始处理,以及执行一系列初始化操作。这些步骤确保了应用在启动时拥有一个稳定和正确的运行环境。

理解这些初始化过程,不仅有助于我们更好地理解 iOS 应用的启动机制,还能帮助我们在开发过程中优化应用的启动性能。希望这篇文章能对你有所帮助,让你对 iOS 应用的启动过程有更深入的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建最基本的web服务器-http模块

在Node.js中,可以使用内置的http模块来创建一个最基本的web服务器。以下是一个简单的示例,它创建了一个HTTP服务器,该服务器监听一个端口,并在接收到请求时发送一个“Hello, World!”的响应。 // 引入http模块 const http requi…

leetcode 二分查找·系统掌握 寻找比目标字母大的最小字母

题目: 给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个字符。 题解&…

C++及cmake语法介绍

c/cmake学习 文章目录 c/cmake学习1. c1.1 基本模型1.1.1 for循环1.1.2 main函数1.1.2 带参数函数编译函数 2. CMAKE2.1 相关命令2.1.1 编译基本命令2.1.2 动态库静态库编译2.1.3 消息输出2.1.4 cmake变量常见参数1. 设置构建类型2. 设置编译器标志3. 指定编译器4. 设置安装路径…

机器学习_PCA

目录 一、概念 二、原理 三、步骤 四、实战 1、数据处理——转rgb为灰度图像 2、手动实现pca降维 3、查看信息保留数量 4、调用第三方库实现pca降维 五、小结 引入: 当说黄河五路和渤海三路交叉口的时候,这些路就类似于我们说的坐标系。而城市中的…

高等数学笔记(三):导数

一、导数概念 1.1 导数的定义 1.1.1 函数在一点处的导数与导函数 1.1.2 单侧导数 1.2 导数的几何意义 1.3 函数可导性与连续性的关系 二、函数的求导法则 2.1 函数的和、差、积、商的求导法则 2.2 反函数的求导法则 2.3 复合函数的求导法则 2.4 基本求导法则与导数公式 三…

read code and make summer (python)

read code and make summer ==标题==:语法==标题==:类的定义==标题==:继承==标题==:多态==标题==:__all__ = [create_dataset, create_dataloader]==标题==:yield==标题==: f-string(格式化字符串)==标题==:getattr()==标题==:logging==标题==:seed==标题==:slice…

必看!!! 2024 最新 PG 硬核干货大盘点(上)

PGConf.dev(原名PGCon,从2007年至2023年)首次在风景如画的加拿大温哥华市举办。此次重新定位的会议带来了全新的视角和多项新的内容,参会体验再次升级。尽管 PGCon 历来更侧重于开发者,吸引来自世界各地的资深开发者、…

Nginx常用配置、反向代理

目录 1. 常用配置 基本设置 HTTP配置 虚拟主机配置 2. 高级配置 反向代理配置 SSL/TLS配置 负载均衡配置 1. 常用配置 基本设置 user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;user nginx;: 指定Nginx worker…

深入理解并打败C语言难关之一————指针(5)(最终篇)

前言: 仔细一想,小编已经把指针的大部分内容都说了一遍了,小编目前有点灵感枯竭了,今天决定就结束指针这一大山,可能很多小编并没有提到过,如果有些没说的小编会在后续博客进行补充道,不多废话了…

服务器数据恢复—NTFS文件系统下双循环riad5数据恢复案例

服务器存储数据恢复环境: EMC CX4-480存储,该存储中有10块硬盘,其中有3块磁盘为掉线磁盘,另外7块磁盘组成一组RAID5磁盘阵列。运维人员在处理掉线磁盘时只添加新的硬盘做rebuild,并没有将掉线的硬盘拔掉,所…

ARCGIS 如何对河流等线条图形进行Smooth处理——具有多个断点高阶版

1.线转点折点(注意!很重要,不是线转点) 2.点转线步骤 ## 3 线的融合 2.1 新建Filed 》短精度类型》利用选择工具的 线文件。全选同一条河流点,进入Tabel的选择界面。给同一条河赋值同一个值。 大功告成!…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及多类型储能调频容量动态申报的电能量与调频市场联合出清方法研究》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

深入探究RTOS的任务调度

阅读引言: 此文将会从一个工程文件, 一步一步的分析RTOS的任务调度实现, 这里选用FreeRTOS分析, 别的也差不多的, 可能在细节上有少许不一样。 目录 1, 常见嵌入式实时操作系统 2, 任务调度的…

HDFS 面试题(一)

1. 简述什么是HDFS,以及HDFS作用 ? HDFS,全称为Hadoop Distributed File System,即Hadoop分布式文件系统,是一个分布式文件系统,由Apache Hadoop项目的一部分。它被设计用来在廉价的硬件上运行&#xff0c…

练习题-18 计算两个积分

计算积分 I ∫ R e − t 4 d t . I\int_{\mathbb{R}} e^{-t^4} dt. I∫R​e−t4dt. 解:令 x t 4 xt^4 xt4. 则 I 2 ∫ 0 ∞ e − x ⋅ 1 4 ⋅ x − 3 / 4 d x 1 2 Γ ( 1 4 ) I 2\int_0^\infty e^{-x} \cdot \frac{1}{4}\cdot x^{-3/4} dx\frac{1}{2} \Gamma(…

SQLite Delete 语句

SQLite Delete 语句 SQLite 的 DELETE 语句用于从表中删除数据。它是 SQL 数据库管理中非常基础且重要的操作之一。在使用 DELETE 语句时,可以删除表中的特定行,也可以删除整个表的数据。本文将详细介绍 SQLite 中的 DELETE 语句,包括其语法…

【机器学习】第11章 神经网络与深度学习(重中之重)

一、概念 1.神经元模型 (1)神经网络的基本组成单位 (2)生物上,每个神经元通过树突接受来自其他被激活神经元的信息,通过轴突释放出来的化学递质改变当前神经元内的电位。当神经元内的电位累计到一个水平时…

Linux虚拟化技术概览:从KVM到Docker

Linux虚拟化技术是现代数据中心和云基础设施的核心组成部分,它允许在同一台物理服务器上运行多个独立的操作系统实例,从而提高资源利用率、灵活性和安全性。从KVM到Docker,Linux虚拟化经历了从传统虚拟机到轻量级容器的演进,下面是…

时间戳转时间格式小记——个位数月份 如何去掉补位0的情况

工作中遇到的问题小记一下 时间戳:1710172800 时间格式:2024-03-12 00:00:00 在无要求的情况下这种情况很OK 当我们需要时间格式为:2024-3-12 00:00:00 那常规情况就不适用 解决: import time sjc 1710172800 # Windows 环境…

Kubernetes Dashboard

Dashboard Dashboard 的项目网站,可以查看说明文档和基本的使用情况。 下载yaml wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml注意需要修改镜像,不然可能会拉去不下来镜像 cat recommended.yaml…