objective-c - 静态变量和全局变量之间的区别

标签 objective-c global-variables instance-variables static-variables

下面的代码有什么区别?

@implementation MyClass

static int myVar =0;
int _myVar =0;

我为 MyClass 的不同对象获取相同的值,并且这两个值对于 MyClass 的所有方法都是可见的...

最佳答案

静态变量和全局变量在生命周期和范围方面的行为有很大不同。首先,让我区分一下生命周期和范围。对象的生命周期决定了该对象是否仍在(进程的)内存中,而对象的范围是我是否可以通过该位置的名称知道该变量。对象可能是事件的,但不可见(不在作用域内),但并非该对象不活动但在作用域内(通过指针引用对象的动态分配对象除外)。

静态变量在定义它们的模块范围内是局部的,但生命周期贯穿于整个程序。假设函数内部的静态变量不能从函数外部调用(因为它不在作用域内),但它是事件的并且存在于内存中。下次进入该函数时(在同一程序内),将访问相同的内存块,现在保留变量旧值,并且这次不会像函数中的其他变量(自动变量)一样为此变量分配新内存。所以基本上这个变量在整个程序中持续存在。类似地,如果在全局空间中定义静态变量(例如在文件开头),则该变量将是 只能在此文件中访问(文件范围)。

另一方面,全局变量必须在全局范围内定义,在整个程序中持续存在(生命),作用域也在整个程序中。这意味着可以从程序的任何函数、任何文件访问此类变量。

因此,如果您有一个全局变量并且您将文件作为库分发,并且您希望其他人不访问您的全局变量,您可以通过添加关键字 static 将其设为静态(当然,如果其他中不需要相同的变量)你的文件)。

关于objective-c - 静态变量和全局变量之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30817946/

相关文章:

objective-c - 更改 UIDocument 交互图标

objective-c - 初始化程序元素不是编译时常量错误

iphone - 调试版本工作,发布版本失败-llvm-gcc-4.2失败,退出代码为1

c - 尽管未对其进行任何更改,C 中的全局变量也会发生变化

objective-c - 将 ivar 放在类扩展中有什么问题?

java - 局部引用变量也称为组合吗?

ios - 默认 ios 邮件应用程序打开时关闭键盘

node.js - node-red 中的全局上下文用于存储 http req 和 res 对象

javascript - 返回全局变量的函数

java - Java 中对象的实例,奇怪的行为