【iOS】浅析static,const,extern关键字

news2024/9/24 3:20:17

文章目录

  • 前言
  • 一、static
    • static修饰局部变量
    • static修饰全局变量
    • 总结
  • 二、const
  • 三、extern
    • 声明全局变量
    • 声明函数
    • 在头文件中使用
    • 总结


前言

笔者本周在学习单例模式时,用到了static关键字,特此总结博客记录学习static,const,extern关键字的过程

一、static

static——静态,我们将用static修饰的变量称为静态变量。

静态变量的生命周期与程序的运行时间相同,它们在程序启动时被创建,在程序结束时才被销毁。这与局部变量(在函数内部定义的变量)不同,局部变量的生命周期仅限于函数的执行过程。因此被称为静态变量

static分两种情况,修饰局部变量和全局变量。
我们首先要搞清楚生命周期和作用域的概念。

  • 生命周期:这个变量能存活多久,它所占用的内存什么时候分配,什么时候收回。
  • 作用域:说白了就是这个变量在什么区域是可见的,可以拿来用的。

static修饰局部变量

在函数或者说代码块内部声明的变量叫局部变量。

我们一段代码来展开我们的讲解:

- (int)add {
    int a = 0;
    a++;
    return a;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    for (int i = 0; i < 5; i++) {
        NSLog(@"%d", [self add]);
    }
}

在add代码块中,a就是一个局部变量,当我们重复调用add方法时,我们的变量a也在被程序不断地分配空间与销毁。当一次add方法结束后,也就是我们的变量超出作用域时,我们的a就会被销毁,下一次调用变量a时系统会为其重新分配内存空间。

而从底层的角度来理解,就是大多数局部变量存储在栈内存中,这意味着它们的内存分配和释放是自动处理的。当局部变量超出其作用域时,栈上的内存会自动回收。

打印结果:
在这里插入图片描述
可以看到我们的a是在不断被重置的


当我们用static修饰局部变量时,变量被称为静态局部变量,这个静态局部变量和全局变量,静态全局变量一样,是存储在静态存储区。由于存储在静态存储区,所以这块内存直到程序结束才会销毁

也就是说,静态局部变量的生命周期整个源程序。但是它只在声明它的代码块可见,也就是说它的作用域是声明它的代码块

我们把局部变量a用static修饰:

 - (int)add {
    static int a = 0;
    a++;
    return a;
}

 - (void)viewDidLoad {
    [super viewDidLoad];
    for (int i = 0; i < 5; i++) {
        NSLog(@"%d", [self add]);
    }
}

打印结果:
在这里插入图片描述
可以看到我们重复调用add方法时我们的变量a并没有被销毁,这是因为a作为静态局部变量

  • 存储在静态内存区:静态局部变量通常存储在程序的静态内存区域,而不是栈内存中。栈内存中的变量在函数调用结束时会自动销毁,但静态内存区中的变量在程序运行期间一直存在,也就是说其作用域是整个源程序
  • 初始化只发生一次:静态局部变量的初始化仅在第一次进入包含它的作用域时发生。一旦被初始化,它的值会一直保持不变,不会在后续函数调用中重新初始化。这是因为在函数的每次调用之间,静态局部变量的状态会得到保持,因此它们的值会被保留

总之,静态局部变量之所以不会被销毁,是因为它们在内存中只有一个实例,其生命周期跨越了函数调用,而不仅仅局限于函数内部。这使得它们非常适合用于需要保持状态或跟踪信息的情况。

static修饰全局变量

当全局变量没有使用static修饰符时,其存储在静态存储区,直到程序结束才销毁。也就是其作用域是整个源程序。我们可以使用extern关键字来引用这个全局变量

在这里插入图片描述
在这里插入图片描述
我们可以在viewcontroller文件中直接调用全局变量b


当我们用static修饰b时
在这里插入图片描述
出现如下错误:
在这里插入图片描述
其实就是在其他文件中我们无法访问到变量b了

总结

static修饰局部变量:将局部变量的本来分配在栈区改为分配在静态存储区,改变了局部变量的生命周期与作用域
static修饰全局变量:本来是在整个源程序的所有文件都可见,static修饰后,改为只在申明自己的文件可见,即修改了作用域


二、const

const主要强调当前变量无法被修改
在这里插入图片描述

这段代码表明我们的c无法被修改

这样定义相对于用#define来定义的话,优点就在于它指定了变量的类型,而#define是不能指定变量的类型的。


三、extern

extern 是一个关键字,用于声明在其他源文件中定义的全局变量或函数它的作用是告诉编译器某个标识符的定义在其他文件中,并且在当前文件中要使用它。extern 主要用于跨文件之间共享变量和函数的声明

声明全局变量

extern 用于声明全局变量,表示该变量的定义在其他源文件中。这允许多个源文件共享同一个全局变量。

// 在文件1.h中定义全局变量
int globalVariable;

// 在文件2.c中使用全局变量的声明
extern int globalVariable;

int main() {
    globalVariable = 42;
    return 0;
	printf("%d", globalVariable);
}

输出结果:
在这里插入图片描述

声明函数

extern 也可用于声明函数,表示该函数的定义在其他源文件中。这允许在一个源文件中调用在另一个源文件中定义的函数。

// 在文件1.c中定义函数
void myFunction();

// 在文件2.c中使用函数的声明
extern void myFunction();

int main() {
    myFunction(); // 调用在其他文件中定义的函数
    return 0;
}

在头文件中使用

通常,extern 声明会放在头文件中,并在需要的源文件中包含该头文件,以便多个源文件可以共享相同的声明。

// Header.h 头文件
extern int globalVariable;
extern void myFunction();
// 文件1.c
#include "Header.h"
// 使用 globalVariable 和 myFunction
// 文件2.c
#include "Header.h"
// 使用 globalVariable 和 myFunction

总结

extern 关键字用于声明在其他源文件中定义的全局变量和函数。它使得不同源文件可以共享全局标识符的声明,从而实现了跨文件的变量和函数的共享和使用。

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

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

相关文章

文件名批量重命名与翻译的实用指南

随着电脑使用的普及&#xff0c;我们经常需要处理大量的文件和文件。有时&#xff0c;我们可能希望将文件的名称进行批量修改&#xff0c;并且还希望将这些名称翻译成其他语言&#xff0c;以便更好地管理和查找文件。在这篇文章中&#xff0c;我们将介绍一种实用的技巧&#xf…

【面试经典150 | 数组】删除有序数组中的重复项 II

文章目录 写在前面Tag题目解读题目来源解题思路方法一&#xff1a;原地操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等…

Hadoop生态圈中的数据同步工具SQOOP

Hadoop生态圈中的数据同步工具SQOOP 一、sqoop的概念二、sqoop的核心功能1、数据导入import2、数据导出export 三、sqoop的底层实现四、sqoop的安装和部署五、sqoop的基本操作1、sqoop查看RDBMS中有哪些数据库2、sqoop查看某一个数据库下有哪些数据表3、通过sqoop执行sql语句 …

SOLIDWORKS有限元分析怎么做?

在许多专业领域中&#xff0c;尤其是在机械行业&#xff0c;为了缩短开发周期&#xff0c;设计完成后通常需要进行仿真分析。通常情况下&#xff0c;大家会使用专业的有限元仿真软件如ANSYS进行仿真分析。但其实&#xff0c;SOLIDWORKS软件因其简单易用的制图功能以及内置的专用…

bigcache

bigcache 介绍 借用下图片&#xff0c;实际上&#xff0c;这张图还不太全&#xff0c;queueItem 中&#xff0c;entrydata的最前端 8 字节是时间戳&#xff0c;用来计算过期时间的。 bigcache 的思想主要有以下几点&#xff1a; 大并发下&#xff0c;尽量减少同步带来的时…

3 分钟,带你了解低代码开发

一、低代码平台存在的意义 传统软件开发交付链中&#xff0c;需求经过3次传递&#xff0c;用户→业务→架构师→开发&#xff0c;每一层传递都可能使需求失真&#xff0c;导致最终交付的功能返工。 业务的变化促使软件开发过程不断更新、迭代和演进&#xff0c;而低代码开发即是…

2023!6招玩转 Appium 自动化测试

Appium是个什么鬼 Appium是一个移动端的自动化框架&#xff0c;可用于测试原生应用&#xff0c;移动网页应用和混合型应用&#xff0c;且是跨平台的。可用于IOS和Android以及firefox的操作系统。原生的应用是指用android或ios的sdk编写的应用&#xff0c;移动网页应用是指网页…

合约谈崩,3大汽车厂工人集体罢工 | 百能云芯

周五&#xff0c;美国联合汽车工会&#xff08;UAW&#xff09;在底特律三大汽车制造商通用汽车、福特汽车和克莱斯勒母公司Stellantis旗下的各一家工厂同步举行了罢工&#xff0c;可能因工资和就业保障问题引发一场代价高昂且长时间的对峙。 协商签订新劳资协议的最后期限已过…

【多线程】死锁 详解

死锁 一. 死锁是什么二. 死锁的场景1. 一个线程一把锁2. 两个线程两把锁3. N 个线程 M 把锁 三. 死锁产生的四个必要条件四. 如何避免死锁 一. 死锁是什么 死锁是这样一种情形&#xff1a; 多个线程同时被阻塞&#xff0c;因为每个进程都在等其他线程释放某些资源&#xff0c;…

在波卡区块链学院学习 Web3 是种什么体验?

成立于 2022 年的 Polkadot Blockchain Academy&#xff08;波卡区块链学院&#xff0c;以下简称 PBA&#xff09;是由波卡生态成立的一个深入的、开创性的区块链课程&#xff0c;致力于帮助 Web3 创新者和未来的顶级编程人员实现他们的想法和抱负。 波卡区块链学院由波卡创始…

LeetCode 1222. 可以攻击国王的皇后【数组,模拟】1391

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Yakit学习

Yakit下载 下载地址&#xff1a; yaklang/yakit: Cyber Security ALL-IN-ONE Platform (github.com) MITM交互式劫持 这个模块相当于burpsuite的proxy模块&#xff0c;MITM 操作台可百分百替代 BurpSuite执行所有操作(下载并安装证书、劫持请求、响应、编辑劫持到的数据包等)。…

Datax 数据同步-使用总结(二)

一、前言 这部分主要记录 datax 实现增量同步的方案。 二、核心思路 结合datax 提供的preSql、 postSql以及占位符&#xff0c;外加另外一张表同步日志表来记录相关同步信息。 三、版本迭代 3.1 初版本 where tbq.opera_date > cast(date_format(DATE_SUB(NOW(), inte…

图论第四天|127. 单词接龙、841. 钥匙和房间、463. 岛屿的周长

127. 单词接龙 ★ 文档讲解 &#xff1a;代码随想录 - 127. 单词接龙 状态&#xff1a;开始学习。&#xff08;★&#xff1a;需要多次回顾并重点回顾&#xff09; 思路&#xff1a; 本题需要解决两个问题&#xff1a; 图中的线是如何连在一起的 题目中并没有给出点与点之间的…

【Robotframework+python】实现http接口自动化测试

前言 下周即将展开一个http接口测试的需求&#xff0c;刚刚完成的java类接口测试工作中&#xff0c;由于之前犯懒&#xff0c;没有提前搭建好自动化回归测试框架&#xff0c;以至于后期rd每修改一个bug&#xff0c;经常导致之前没有问题的case又产生了bug&#xff0c;所以需要…

长城汽车,能打“持久战”吗?

文丨智能相对论 作者丨沈浪 百年汽车工业史正在进入一个全新的发展阶段&#xff1a;油改电的变革仍在激化&#xff0c;智能化的探索才刚刚起步&#xff0c;汽车产品将以什么样的面貌展现在世人面前&#xff0c;市场格局又将迎来怎样的变化&#xff1f;无人可知。 然而&#…

【Linix-Day12-线程同步和线程安全】

线程同步 和 线程安全 线程同步 除了信号量和互斥锁&#xff08;互斥锁和条件变量上次介绍过&#xff09;&#xff0c;还有两种方式同步 1.读写锁 当同时对一块内存读写时&#xff0c;会出现下列问题&#xff0c;故而引入读写锁 接口介绍&#xff1a; 1.int pthread_rwloc…

PostgreSQL 事务并发锁

文章目录 PostgreSQL 事务大家都知道的 ACID事务的基本使用保存点 PostgreSQL 并发并发问题MVCC PostgreSQL 锁机制表锁行锁 总结 PostgreSQL 事务 大家都知道的 ACID 在日常操作中&#xff0c;对于一组相关操作&#xff0c;通常要求要么都成功&#xff0c;要么都失败。在关系…

Windows PHP 将 WORD转PDF,执行完成后 释放进程

Windows PHP 将 WORD转PDF,执行完成后 释放进程 word转PDF清理任务进程 【附赠彩蛋】每次PHP执行完word转pdf之后,在任务进程中都会生成并残留WINWORD.EXE进程,时间久了,服务器就会越来原卡,本文完整的讲述怎么转PDF和转换之后的操作。 word转PDF /**$doc 传入完整的doc路…