objective-C:全局变量、静态变量、常量的区别

全局变量

- 什么是全局变量

全局变量即该变量不仅可以在所定义的文件内被访问,也可以在其他文件中被访问。凡是定义在函数或方法之外的变量(除静态变量之外)都是全局变量。

- 使用方法

为了维护方便及可读性,全局变量一般定义在源文件(.m)的起始位置。其他文件想使用该全局变量时,需要先使用关键字extern进行声明。全局变量可以多次声明,为了方便,一般会在定义该全局变量的文件的头文件(.h)中声明,其他文件需要使用该全局变量时,直接import该头文件(.h)即可。

- 全局变量为什么不能定义在头文件中

全局变量,也叫外部全局变量,是整个工程唯一但,且只能定义一次,所以全局变量不可定义在头文件(.h)中,如果有多个文件import了一个定义了外部全局变量的头文件,那么整个工程中就会出现多个同名同类型的全局变量,此时编译器会报错“x duplicate symbols”,x的值取决于多少个文件import了定义该全局变量的文件。

- 存储位置

全局变量保存在内存的全局(静态)存储区中,可多次改变值,无赋值时为nil。

静态变量

- 什么是静态变量

当我们希望一个变量不仅仅是作用于某个对象,而是作用于整个类的时候,这时候就可以使用静态变量。静态变量用static修饰,是一个私有的全局变量,所以静态变量也被称为内部全局变量,意思是静态变量在所定义的位置是全局的,但是不可以被其他文件访问。

- 定义位置与作用域

静态变量的作用域是与它定义的位置有关,定义在文件中它的作用域就是整个文件,定义在方法内,它的作用域就是该方法。静态变量定义在方法内时,该方法或函数不管被调用多少次,都共享一个变量。类方法、实例方法、函数都可以使用静态变量。

- 静态变量为什么不能定义在头文件中

同样的,静态变量不推荐定义在头文件中,如果多个头文件定义了同样名称的静态变量,编译时会报错“重复定义”。就算不重复定义,而是在b文件使用a文件定义的静态变量,其实使用的也不是同一个静态变量,而是在b文件里面定义了一个同名的静态变量,它们各自享有着独立的内存空间。所以静态变量一定要定义在源文件中。

- 存储位置

静态变量跟全局变量一样,都保存在全局(静态)存储区中。

常量

常量使用const修饰,在定义的时候就必须初始化,初始化好以后值不可改变,如果没有初始化,数值型的常量会被系统自动赋值为0,对象型的常量则为nil。

- 定义语法

定义一个非对象类型的常量的语法为

const NSTimeInterval myTimeDuration = 0.5;

如下定义的效果与上面一致,

NSTimeInterval const myTimeDuration = 0.5;

当我们定义一个对象类型的常量时,应把const放在*(指针指向符)之后,此时表示指针指向的内存的内容不可变的,语法为

NSString * const myName = @"someString";

下面两种定义方式,表示指针指向的内存地址是不可变的,而内存保存的内容是可变的。

NSString const * myName = @"someString";
const NSString * myName = @"someString";
- 全局常量与静态常量

当常量定义在函数和方法之外时,即为全局常量,可被其他文件所使用,使用方法跟全局变量一样,const也可修饰静态变量。不管是全局常量,还是静态常量,值都不可改变。

- 常量也不能定义在头文件中

常量也一样要定义在源文件中,如果定义在头文件中,编译时会报错“x duplicate symbols”,x的值取决于多少个文件import了定义该常量的文件。

- 存储位置

常量的存储区域同全局变量、静态变量。

内存分区

程序对内存的使用分为以下几个区:

  • 栈区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值等。函数执行结束时这些存储单元自动被释放。效率高,但分配的内存容量有限。
  • 堆区(heap):亦称动态内存分配,一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。如果没有及时释放不再使用的动态内存,我们认为发生内存泄漏。
  • 全局区(static):该区的内存在程序编译的时候就已经分配好,在程序的整个运行期间都存在。内存中所有的字节默认值都是0x00。它主要存放静态数据、全局数据和常量。
  • 文字常量区:常量字符串放在此,程序结束后由系统释放。
  • 程序代码区:存放函数体的二进制代码。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值