以下代码有什么区别?
@implementation MyClass
static int myVar =0;
int _myVar =0;
我为MyClass
的不同对象获取相同的值,并且MyClass
的所有方法都可以看到...
答案 0 :(得分:2)
静态和全局变量的行为与生活和范围有很大不同。首先,让我区分生活和范围。对象的生命期确定对象是否仍在(进程的)内存中,而对象的范围是我是否可以通过其在此位置的名称知道该变量。对象可能是活动的,但不可见(不在范围内)但是该对象不是活动的,而是在范围内(动态分配的对象除外,您通过指针引用对象)。
静态变量在其定义它们的模块的范围内是本地的,但生命在整个程序中。假设函数内部的静态变量不能从函数外部调用(因为它不在范围内),而是存活在内存中。下次输入此函数(在同一程序中)时,将访问相同的内存块,现在保留变量旧值,此次没有为该变量分配新内存,如同函数中的其他变量(自动变量)。所以基本上变量在整个程序中都存在。类似地,如果在全局空间中定义静态变量(例如在文件的开头),则该变量将是 只能在此文件(文件范围)中访问。
另一方面,全局变量必须全局定义,在整个程序中持续存在(生命),范围也贯穿整个程序。这意味着可以从任何函数,程序的任何文件访问这些变量。
因此,如果您有一个全局变量并且将ur文件作为库分发并且您希望其他人不能访问您的全局变量,那么您可以通过在关键字static之前添加前缀来保持静态(当然,如果其他变量不需要相同的变量)你的文件)。
答案 1 :(得分:0)
static
限制变量的范围。在您的案例中,变量将在MyClass
文件中可见。
但是,声明没有static
的变量意味着默认情况下变量是自动。这意味着您的static
将在所有方法调用中生效,并且在调用方法时会分配automatic
,然后在某个时候解除分配。
答案 2 :(得分:0)
这两个变量都与MyClass
无关,而且两者都是全局的,这就是为什么你在MyClass
的所有实例中都看到相同的值。如果你想让_myVar
成为一个实例变量,那么它需要在括号之间进行:
@implementation MyClass {
int _myVar;
}
...
@end
代码中的变量之间的差异是static
变量不能在实现文件的范围之外访问(我假设称为MyClass.m
),而非{{1}可以从应用程序的任何位置访问一个,但是您需要在任何想要访问它的代码中使编译器满意static
;这通常是通过将extern int _myVar;
声明放在头文件中来完成的。