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
只是将aVar
variables标记为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名称可能导致应用程序中的名称冲突。