为什么/何时应该使用static声明变量?

时间:2013-06-18 01:46:31

标签: objective-c static

我没有C / C ++的背景知识。我刚刚开始使用其他语言学习Objective-C。

在哪些情况下,我应该使用常规ivars或属性的变量静态声明?我该怎么做才能做到这一点?

感谢

5 个答案:

答案 0 :(得分:5)

全局变量和函数

默认情况下,导出所有符号(全局变量和函数)(对其他源文件中的代码可见)。如果声明了全局变量static,则不会导出它。这意味着只能访问当前源文件中的代码。

当您有一个要限制访问的全局变量,并且不想担心名称冲突时,这非常有用。例如,如果要维护计数器以跟踪已创建的类的实例数,则可以创建static int gInstanceCount。由于它是static,你会知道(1)没有其他代码可以修改变量,(2)如果某个其他文件使用具有相同名称的全局,则不会发生任何冲突。

头文件中的静态声明

请注意,当您在头文件中放入某些内容时,就好像您将该代码复制并粘贴到包含它的每个其他文件中。这意味着如果你在头文件中声明某些东西是静态的,那么包含它的每个文件都会获得它自己的副本。

这意味着如果您在static int foo中声明Foo.h,然后在foo = 4中编写执行Bar.m,当您尝试在Other.m中访问该值时,您赢了不一定得到4回。

本地静态变量

您还可以将局部变量(在函数或方法体内)定义为static。通常,局部变量在“堆栈”上分配,这意味着它们是在执行函数时创建的,并在函数退出时释放。如果两个线程同时进入同一个函数(或者一个线程对函数进行递归调用),每个线程都会获得一大块内存来处理,而它所做的任何事情都不会影响任何其他线程。

但是,本地static变量存储在“堆”中。函数的所有执行都共享相同的内存位置。此外,当函数结束时,该值保持不变。这就是为什么在Objective-C单例对象的sharedInstance方法中经常使用局部静态变量。

在大多数情况下,本地static变量基本上就像一个全局变量,只能在声明它的函数内部看到。

答案 1 :(得分:1)

static关键字用于为全局变量提供范围。通常,在函数外部定义的全局变量具有公共范围,并且对项目中的所有.m或.c文件可见。使变量static允许您拥有一个“全局”变量,该变量的范围(可见)仅限于包含变量定义的.m或.c文件。这允许您拥有一个变量,该变量可以由单个源文件中的多个函数共享,同时避免潜在的命名冲突。另外值得注意的是,extern关键字允许您指示特定的全局变量在不同的源文件中初始化但在此源文件中使用。

答案 2 :(得分:1)

关键字static在C中被过度使用。它意味着几件不同的事情。在某些情况下,它只表示该字段仅在该文件的其余部分(编译单元)中被理解。换句话说,它无法链接到其他文件。

在Java和C ++中,静态类成员是在类级别而不是单个对象级别定义的,因此一个值由该类(或其子类之一)的所有对象共享。不幸的是,恕我直言,目标C不支持这一点。而是在文件级别use静态。

答案 3 :(得分:0)

如果您不知道是否需要静态变量,则可能不需要静态变量。

您可能使用静态变量的一个原因是提供一个类变量(即整个类的一个变量,而不是一个实例变量,类的每个实例都拥有它自己的副本)。

This question(及其接受的答案)解释了如何使用静态变量来模拟Objective-C中的类变量。

答案 4 :(得分:0)

首先:在这个上下文中的“对象”指的是“c对象”,非常简单的话,就是生活在运行时的东西。它与OOP或Objective-C意义上的对象无关。您可以将对象视为var。

static与范围无关。外部标识符(=在块外声明)的static具有内部链接。连接结果在ISO / IEC 9899:TC3第6.2.2节中定义。范围在6.2.1节中定义。 简而言之,内部链接意味着不同翻译单元中的两个标识符(“.m文件”)不表示相同的对象,而是表示不同的对象。每个翻译单元都有自己的“对象”。

如果标识符不是使用静态存储类声明的extern(=块内),则它从程序执行开始到程序停止运行时具有生命周期。