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