这些行都在@implementation
声明上方的实现文件中。
NSString * const aVar = @"aVarStringValue";
static NSString *aVar = @"aVarStringValue";
据我了解,第二个static
仅在应用程序的生命周期内分配一次,这一事实有助于提高性能。
但这是否意味着它本质上是一个内存泄漏,因为该内存块永远不会被释放?
并且每次访问时都会分配第一个const
声明吗?
答案 0 :(得分:98)
static
关键字表示变量的可见性。静态变量(不在方法中)只能在该特定.m
文件中访问。另一方面,静态局部变量只被分配一次。
const
表示不能修改和/或重新分配引用;并且它与如何创建是正交的(编译器可能会优化consts)。
值得一提的是NSString
文字在应用程序的生命周期中被初始化并且永远不会被破坏。它们被分配在内存的只读部分。
答案 1 :(得分:49)
static 只会更改变量的范围,而不会更改它的声明或存储方式。
在这两种情况下,编译器都将创建存储在mach-o文件中的NSString实例的常量版本。因此,只有一个实例(请注意,您可以更改行为以使字符串在mach-o的加载时动态创建,但仍然只有一个实例)。
static
只是将aVar
变量标记为在编译单元范围内可见 - 仅限文件。如果没有static
,您可以将字符串重新声明为某个标题中的extern NSString *aVar;
,并可以从任何位置访问它。
const
是正交的,在NSString的情况下,引用几乎完全不相关。
答案 2 :(得分:5)
为了解决有关static
的需求和const
的位置的所有可能讨论:
根据C99 / GNU99规范(通常用于Objective-C代码):
static
是存储类说明符
默认情况下,文件级范围的对象具有外部链接
const
是类型限定符(是类型的一部分)
关键字应用于即时左侧实例 - 即
MyObj const * myVar;
- 指向const限定对象类型的非限定指针
MyObj * const myVar;
- const限定指向非限定对象类型的指针
最左边的用法 - 应用于对象类型,而不是变量
const MyObj * myVar;
- 指向const限定对象类型的非限定指针<强>这样的:强>
static NSString * const myVar;
- 指向具有内部链接的不可变字符串的常量指针。
缺少static
关键字会使变量名称成为全局变量,并可能导致应用程序中的名称冲突。