main() 函数执行前,具体会初始化和创建哪些全局变量 ?

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

具体会初始化和创建哪些全局变量 ?

在 iOS 应用程序的启动过程中,初始化和创建全局变量的步骤确实包含了多种类型的全局变量。具体来说,包含以下几种类型:

  1. C 全局变量

    • 这些变量在程序加载时分配内存并初始化,生命周期与程序运行时一致。
  2. C 静态全局变量

    • 这些变量与普通全局变量类似,但它们仅在声明它们的文件中可见。
  3. C++ 全局变量

    • 这些变量在程序加载时分配内存,并调用其构造函数进行初始化。
  4. C++ 静态全局变量

    • 类似于 C++ 全局变量,但它们仅在声明它们的文件中可见,并在程序加载时调用其构造函数进行初始化。
  5. Objective-C 全局变量

    • 这些变量在程序加载时分配内存并初始化,生命周期与程序运行时一致。
  6. Objective-C 静态全局变量

    • 类似于 C 静态全局变量,但用于 Objective-C 类型。

初始化顺序

初始化的顺序依赖于编译器和链接器的实现,但通常遵循以下顺序:

  1. 调用用 attribute((constructor)) 修饰的函数

    • 这些函数首先被调用,进行早期的初始化操作。
  2. 执行类和 Category 的 +load 方法

    • 接下来,Objective-C 运行时会执行所有类和 Category 的 +load 方法。
  3. 初始化全局变量

    • 最后,初始化各种全局变量。这包括:
      • C 和 C++ 全局变量:按定义顺序初始化。
      • C 和 C++ 静态全局变量:按定义顺序初始化,但仅在声明文件中可见。
      • Objective-C 全局变量:与普通全局变量类似,按定义顺序初始化。
      • Objective-C 静态全局变量:按定义顺序初始化,但仅在声明文件中可见。

示例

// C 全局变量
int global_c_variable = 10;// C 静态全局变量
static int static_global_c_variable = 20;// C++ 全局变量
class MyClass {
public:MyClass() { /* 构造函数代码 */ }
};
MyClass global_cpp_variable;// C++ 静态全局变量
static MyClass static_global_cpp_variable;// Objective-C 全局变量
NSString *global_objc_variable = @"Hello";// Objective-C 静态全局变量
static NSString *static_global_objc_variable = @"World";

这些全局变量会在程序启动时依次初始化,确保它们在 main() 函数执行前已经准备就绪。这种初始化顺序和机制确保了应用程序在启动时的稳定性和一致性。

所有全局变量都是在 main() 函数执行前, 初始化和创建的么 ?

在 iOS 应用程序中,绝大多数全局变量确实都是在 main() 函数执行之前初始化和创建的。这包括 C、C++ 和 Objective-C 的全局变量和静态全局变量。这是因为在程序启动过程中,系统会先进行各种加载和初始化操作,以确保在 main() 函数开始执行时,所有需要的资源和状态都已经准备就绪。

全局变量初始化的顺序

  1. 加载可执行文件和动态链接库

    • 首先加载可执行文件和所有动态链接库,并进行重定位和符号绑定。
  2. 调用 attribute((constructor)) 修饰的函数

    • 这些函数在动态库加载后立即被调用,执行早期的初始化操作。
  3. 执行 Objective-C 类和 Category 的 +load 方法

    • 在调用 main() 之前,Objective-C 运行时会调用所有类和 Category 的 +load 方法,进行类级别的初始化。
  4. 初始化全局变量

    • 在这一步,所有全局变量(包括静态全局变量)都会被初始化。具体来说,包括:
      • C 全局变量和静态全局变量:按照它们在代码中的定义顺序初始化。
      • C++ 全局变量和静态全局变量:在加载时调用它们的构造函数进行初始化。
      • Objective-C 全局变量和静态全局变量:按照定义顺序进行初始化。

特殊情况

虽然上述流程适用于绝大多数情况,但在某些特定场景下,可能会有一些例外:

  1. 懒加载的变量

    • 某些全局变量可能会被设计为懒加载,即在第一次访问时才进行初始化。这种模式通常用于优化启动性能,减少不必要的初始化开销。
  2. 动态加载的库

    • 某些动态库可能在 main() 执行之后才会被动态加载和初始化(例如使用 dlopen 动态加载库)。

例子

以下是一个包含各种全局变量的示例:

// C 全局变量
int global_c_variable = 10;// C 静态全局变量
static int static_global_c_variable = 20;// C++ 全局变量
class MyClass {
public:MyClass() { /* 构造函数代码 */ }
};
MyClass global_cpp_variable;// C++ 静态全局变量
static MyClass static_global_cpp_variable;// Objective-C 全局变量
NSString *global_objc_variable = @"Hello";// Objective-C 静态全局变量
static NSString *static_global_objc_variable = @"World";// attribute((constructor)) 修饰的函数
__attribute__((constructor))
void early_initialization() {// 早期初始化代码
}// main 函数
int main(int argc, char * argv[]) {@autoreleasepool {// 程序的主要逻辑return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}
}

在这个示例中,所有的全局变量都会在 main() 函数执行之前进行初始化。early_initialization 函数会在全局变量初始化之前被调用,用于执行一些早期的初始化逻辑。

总之,大部分全局变量都是在 main() 函数执行之前初始化和创建的,以确保程序在启动时拥有正确的运行环境。

其它的情况,也会在 main() 函数执行前,初始化和创建

下文中变量的定义可能与上方冲突,但这不重要,关注具体的示例就行

在 Objective-C 开发的 iOS 应用中,冷启动时在 main() 函数执行前,系统会创建和初始化以下类型的变量:

1. C 静态全局变量

定义:在 C 语言中声明为 static 的全局变量。
链接范围:具有内部链接,只在声明它的翻译单元内可见。
生命周期:在程序开始时初始化,并在程序结束时销毁。
示例

// MyGlobal.c
#include <stdio.h>static int myStaticGlobalVariable = 42; // 仅在 MyGlobal.c 内可见__attribute__((constructor))
static void initializeMyGlobal() {printf("Initializing C static global variable\n");
}

2. C 全局变量

定义:在 C 语言中未声明为 static 的全局变量。
链接范围:具有外部链接,可以在多个翻译单元中被引用(通过 extern 声明)。
生命周期:在程序开始时初始化,并在程序结束时销毁。
示例

// MyGlobal.h
extern int myGlobalVariable;// MyGlobal.c
#include "MyGlobal.h"int myGlobalVariable = 42;__attribute__((constructor))
void initializeMyGlobal() {printf("Initializing C global variable\n");
}

3. C++ 静态全局变量

定义:在 C++ 中声明为 static 的全局变量。
链接范围:具有内部链接,只在声明它的翻译单元内可见。
生命周期:在程序开始时初始化,并在程序结束时销毁。其初始化顺序在同一个翻译单元内是定义的,但跨翻译单元的初始化顺序是未定义的。
示例

// MyGlobal.cpp
#include <iostream>static int myCppStaticGlobalVariable = 42; // 仅在 MyGlobal.cpp 内可见__attribute__((constructor))
static void initializeMyGlobal() {std::cout << "Initializing C++ static global variable\n";
}

4. C++ 全局变量

定义:在 C++ 中未声明为 static 的全局变量。
链接范围:具有外部链接,可以在多个翻译单元中被引用(通过 extern 声明)。
生命周期:在程序开始时初始化,并在程序结束时销毁。
示例

// MyGlobal.h
extern int myCppGlobalVariable;// MyGlobal.cpp
#include "MyGlobal.h"int myCppGlobalVariable = 42;__attribute__((constructor))
void initializeMyGlobal() {std::cout << "Initializing C++ global variable\n";
}

5. Objective-C 静态全局变量

定义:在 Objective-C 文件中声明为 static 的全局变量。
链接范围:具有内部链接,只在声明它的翻译单元内可见。
生命周期:在程序开始时初始化,并在程序结束时销毁。
示例

// MyGlobal.m
#import <Foundation/Foundation.h>static int myObjCStaticGlobalVariable = 42; // 仅在 MyGlobal.m 内可见__attribute__((constructor))
static void initializeMyGlobal() {NSLog(@"Initializing Objective-C static global variable");
}

6. Objective-C 类静态变量

定义:在 Objective-C 类中声明的静态变量。
链接范围:具有内部链接,只在声明它的类内可见。
生命周期:在程序开始时初始化,并在程序结束时销毁。
示例

// MyClass.h
#import <Foundation/Foundation.h>@interface MyClass : NSObject
+ (void)printStaticVariable;
@end// MyClass.m
#import "MyClass.h"@implementation MyClassstatic int myClassStaticVariable = 42;+ (void)printStaticVariable {NSLog(@"Class static variable: %d", myClassStaticVariable);
}@end

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

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

相关文章

MySQL:SELECT list is not in GROUP BY clause 报错 解决方案

一、前言 一大早上测试环境&#xff0c;发现测试环境的MySQL报错了。 SELECT list is not in GROUP BY clause and contains nonaggregated column二、解决方案 官方文档中提到&#xff1a; 大致意思&#xff1a; 用于GROUP BY的SQL / 92标准要求满足以下条件&#xff1a; SE…

建筑工程乙级资质与工程质量控制体系的构建

1. 质量管理体系建立 ISO 9001认证&#xff1a;虽然不是直接要求&#xff0c;但许多乙级资质企业会选择通过ISO 9001质量管理体系认证&#xff0c;以标准化管理流程&#xff0c;提升质量管理水平。质量方针与目标&#xff1a;明确企业的质量方针&#xff0c;设定可量化、可追踪…

AI绘画ComfyUI-插件-面部修复,快速入门安装使用!

这期给大家分享一个插件AI绘画 ComfyUI的——Impact Pack ComfyUI也是隶属于Stable Diffusion的工作流形式的AI绘画工具。 这是一个综合节点&#xff0c;这期先介绍下这个插件中的面部修复功能 Impact Pack插件 1、下载插件 在ComfyUI管理器中安装节点&#xff0c;搜索Imp…

昇思25天学习打卡营第2天 | 张量基础

内容介绍&#xff1a;张量&#xff08;Tensor&#xff09;是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数&#xff0c;这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。 具体内容&#xff1a; 1. 导包 import numpy as np import minds…

Android 14 权限等级剖析

Android 14 权限等级剖析 Android 14 引入了新的权限等级&#xff0c;为应用程序访问敏感信息和功能提供了更细粒度的控制。了解这些新的权限等级及其应用场景对于开发人员至关重要。 1. 概述 Android 一直以来都使用权限机制来控制应用程序对系统资源和用户数据的访问。随着…

薅羊毛app小游戏对接广告联盟开发

开发一个薅羊毛app小游戏并对接广告联盟是一个涉及多个方面的复杂过程。以下是一些关键步骤和注意事项&#xff0c;帮助你更好地理解和规划这个过程&#xff1a; 1. 明确目标与定位 目标用户群体&#xff1a;确定你的目标用户是谁&#xff0c;他们的兴趣和需求是什么。游戏类…

[动态规划位运算]表达式的期望值

描述 给定如下表达式&#xff1a; A0O1A1O2A2O3A3… OnAn 其中Ai(0<i<n)代表操作数&#xff0c;Oi(1<i<n)代表算子。有三类算子包括‘&’、‘|’和‘^’&#xff0c;这些算子拥有相同的计算优先级。每个算子Oi以及它后面相邻的操作数Ai&#xff0c;他们可能一…

JDK8和JDK17共存以及切换

1. 下载和安装 1.1下载安装JDK17 下载地址: https://www.oracle.com/cn/java/technologies/downloads/ 1.2安装jdk17 点击下一步 此处可以修改安装的目标位置,修改安装位置后,点击下一步 接下来及安装完成 注意事项 此时通过cmd命令java –version你会发现竟然出现了…

四十八、openlayers地图调色总结——锐化、模糊、浮雕滤镜,调整地图色相、饱和度、亮度

这篇是对滤镜的总结&#xff0c;方便工作中直接使用。 想要调整图层的颜色&#xff0c;有两种方法。 方法一&#xff1a; 加载图层时使用tileLoadFunction函数拿到context添加canvas滤镜效果。 this.imagery new TileLayer({source: new XYZ({url: "https://server.arc…

MeshAnything:艺术家级别的自回归3D网格生成

MeshAnything: Artist-Created Mesh Generation with Autoregressive Transformers &#x1f4dc; 文献卡 MeshAnything: Artist-Created Mesh Generation with Autoregressive Transformers作者: Yiwen Chen; Tong He; Di Huang; Weicai Ye; Sijin Chen; Jiaxiang Tang; Xin…

二进制部署Prometheus

在监控里面Prometheus现在用的还是比较多的&#xff0c;一般我们都是在Kubernetes环境里面部署&#xff0c;然后监控咱们的容器化环境&#xff0c;今天给大家分享一些不一样的&#xff0c;使用二进制的方式在机器上直接部署&#xff0c;并且监控机器上的进程。 说到监控大家通常…

普陀食材配送沪鑫餐饮专业化、标准化、现代化新篇章

在上海普陀这片繁华的土地上&#xff0c;企事业单位如繁星点点&#xff0c;它们不仅推动了区域经济的飞速发展&#xff0c;更在员工福利待遇上不断追求卓越。其中&#xff0c;食材配送作为后勤管理的重要环节&#xff0c;正迎来专业化、标准化、现代化的新篇章。 提及普陀食材配…

短视频开源项目MoneyPrinterTurbo:AI副业搞起来,视频制作更轻松!

目录 引言一、MoneyPrinterTurbo简介二、MoneyPrinterTurbo的核心功能三、MoneyPrinterTurbo的未来发展四、MoneyPrinterTurbo与AI副业五、部署实践1、克隆代码2、创建虚拟环境3、安装依赖4、安装好 ImageMagick5、端口映射6、启动Web界面7、模型配置8、填写主题9、视频生成10、…

OpenSSL 生成 RSA 公钥和私钥

sudo apt-get update sudo apt-get install openssl、 生成私钥 openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048 提取公钥 openssl rsa -pubout -in private.pem -out public.pem cat public.pem 将文件导出就行

使用事件日志识别常见 Windows 错误

事件查看器&#xff0c;一个标准的诊断工具&#xff0c;嵌入在Windows操作系统&#xff0c;记录了所有的系统事件&#xff0c;该日志捕获有关硬件问题、软件中断和整体系统行为的详细信息。通过分析这些日志&#xff0c;管理员可以查明系统错误和运行时错误的根本原因。了解如何…

达索系统 PLM:引领创新的数字化解决方案

在当今竞争激烈的商业环境中&#xff0c;企业需要不断提升创新能力和运营效率&#xff0c;以应对快速变化的市场需求。产品生命周期管理&#xff08;PLM&#xff09;系统作为一种综合性的数字化解决方案&#xff0c;正逐渐成为企业实现可持续发展的关键。而达索系统的 PLM 则以…

OpenCV--图像的运算

图像的运算 代码和笔记 代码和笔记 import cv2 import numpy as np""" 图像的运算 """# 读取图片 cat1 cv2.imread(./img/cat.jpeg) cat2 cv2.imread(./img/cat.jpeg)""" 加减乘除 """ # 加法(有点杂交的感觉)…

MySQL的字符集与排序规则

在MySQL数据库中&#xff0c;字符集&#xff08;Character Set&#xff09;和排序规则&#xff08;Collation&#xff09;是两个至关重要的概念&#xff0c;它们共同决定了数据库中字符数据的存储、比较和排序方式。对于涉及多语言、国际化或特殊字符处理的应用来说&#xff0c…

56岁张卫健前任貌突然回春大进化?自曝婚礼前夕流产

现年56岁的江欣燕于1985年以18岁之龄参加第4届新秀歌唱大赛入行&#xff0c;曾拍过多部无线经典电视剧&#xff0c;包括《娱乐插班生》、《同事三分亲》及《女人俱乐部》等。现时甚少作幕前演出的江欣燕日前在社交平台上载分享了新短片&#xff0c;当中更以Deep V上阵&#xff…

大数据集群搭建基础:Hadoop完全分布式搭建学习指南!!

Hadoop完全分布式搭建学习指南 Hadoop版本&#xff1a;Hadoop2.X JDK版本&#xff1a;JDK1.8一、准备工作 设置主机名和IP 在三台CentOS 7.4机器上分别设置主机名和IP&#xff1a; node1: 192.168.14.10node2: 192.168.14.20node3: 192.168.14.30 修改主机名&#xff08;以nod…