2

我没有 C/C++ 的背景。在过去使用其他语言之后,我才开始学习 Objective-C。

在哪些情况下,我应该在常规 ivars 或属性上使用变量的静态声明?我这样做有什么好处?

谢谢

4

5 回答 5

5

全局变量和函数

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

当您想要限制访问的全局变量并且不想担心名称冲突时,这很有用。例如,如果您想维护一个计数器来跟踪创建了多少个类的实例,您可以创建一个static int gInstanceCount. 既然是static,您就会知道 (1) 没有其他代码可以修改该变量,并且 (2) 如果其他一些文件使用同名的全局变量,则不会发生任何冲突。

头文件中的静态声明

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

这意味着如果您声明static int fooinFoo.h然后写入 execute foo = 4in Bar.m,当您尝试访问该值时,Other.m您不一定会得到 4 。

局部静态变量

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

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

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

于 2013-06-18T03:25:45.607 回答
1

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

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

于 2013-06-18T01:59:58.097 回答
1

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

于 2013-06-18T01:55:49.747 回答
0

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

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

这个问题(及其公认的答案)解释了如何使用静态变量来模拟 Objective-C 中的类变量。

于 2013-06-18T03:17:25.747 回答
0

首先:在这种情况下,“object”指的是“c objects”,用非常简单的话来说,就是在运行时存在的东西。它与 OOP 或 Objective-C 意义上的对象无关。您可以将对象视为 var。

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

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

于 2013-06-18T21:51:30.980 回答