0

下面的代码有什么区别?静态和全局变量之间的区别

@implementation MyClass 

static int myVar =0; 
int _myVar =0; 

我为MyClass不同对象获得相同的价值观无一不是的MyClass的所有方法可见......

+0

我出于好奇(不知道Objective-C),但这不是一个基本的面向对象原则? –

回答

1

静态和全局变量在其生命和范围上的行为差异很大。首先,让我区分生活和范围。对象的生命期决定对象是否仍然存在于进程的内存中,而对象的范围是我是否可以通过它在这个位置的名字来知道变量。对象可能是活的,但不可见(不在范围内),但不是该对象不活动,而是在范围内(除了通过指针引用对象的动态分配对象外)。

静态变量在它们的模块范围内是局部的,它们被定义在它们的模块中,但生命在整个程序中。说一个函数内部的静态变量不能从函数外调用(因为它不在作用域内),而是存在于内存中。下一次输入此函数时(在同一程序中),现在将访问相同的内存块,现在保留变量旧值,并且此时不会像该函数中的其他变量(自动变量)那样为此变量分配新内存。所以基本上这个变量在整个程序中持续存在。同样,如果一个静态变量是在全局空间中定义的(比如在文件开始处),那么这个变量将是 只能在这个文件(文件范围)中访问。

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

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

+1

感谢@Jaffer Wilson对您的宝贵意见 –

0

static限制了你的变量的作用域。在你的情况下,变量将在MyClass文件中可见。

但是,默认情况下,不带static的变量声明表示该变量为自动。这意味着你的static将在所有的方法调用中生效,当你调用一个方法然后在某个点解除分配时,automatic将被分配。

0

这两个变量都与MyClass无关,都是全局变量,这就是为什么在MyClass的所有实例中都看到相同的值。如果你想使_myVar一个实例变量,那么它需要支架之间走:

@implementation MyClass { 
    int _myVar; 
} 
... 
@end 

在代码中变量之间的区别在于:static变量无法实现文件的范围之外进行访问(这是我假设被称为MyClass.m),而非static可以从应用程序中的任何位置访问,但是您需要使编译器满意extern int _myVar;任何想要访问它的代码;这通常是通过将extern声明放在头文件中完成的。

相关问题