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引用的情况下几乎是完全不相关的。

为了解决所有关于conststatic和位置需求的讨论:

根据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名称可能导致应用程序中的名称冲突。