Objective-C中的静态NSStrings

Mik*_*ard 6 objective-c nsstring

我经常在类实例方法中看到这样的代码片段:

static NSString *myString = @"This is a string.";
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚为什么会这样.这仅仅是#define的objc等价于方法的范围吗?我(想)我理解变量的静态性质,但更具体地说是关于NSStrings,为什么不是它被分配,init'd?

谢谢〜

har*_*rms 9

我认为这个问题有两个不相关的部分.

一个是它为什么不被分配和初始化.答案是,当您编写@"foo"表单的Objective-C字符串文字时,Objective-C编译器将为您创建一个NSString实例.

另一个问题是static修饰语的作用.它与在C函数中执行的操作相同,确保myString每次使用该方法时变量都相同(即使在不同的对象实例之间).

一个#define宏是完全不同的东西:它的源代码"计划的剪切和粘贴",执行的代码到达编译器之前.


ksm*_*ksm 4

刚刚偶然发现了同样的static NSString声明。我想知道这种静态魔法到底是如何工作的,所以我读了一些。我只想解决你问题的静态部分。

根据K&R, C 中的每个变量都有两个基本属性:类型(例如 float)和存储类(auto、register、static、extern、typedef)。

静态存储类根据是否使用它有两种不同的效果:

  • 代码块内部(例如函数内部),
  • 在所有块之外(与函数处于同一级别)。

块内未声明其存储类的变量默认被视为自动(即它是本地的)。一旦块退出,它将被删除。当您将自动变量声明为静态时,它将在退出时保留其值。当再次调用代码块时,该值仍然存在。

全局变量(与函数在同一级别声明)始终是静态的。显式声明全局变量(或函数)为静态将其范围限制为单个源代码文件。它无法从其他源文件访问,也不会与其他源文件冲突。这称为内部链接

如果您想了解更多信息,请阅读C 中的内部和外部链接