const vs Objective-C中的静态NSStrings

fir*_*der 44 cocoa cocoa-touch objective-c

这些行都在@implementation声明上方的实现文件中.

NSString * const aVar = @"aVarStringValue";

static NSString *aVar = @"aVarStringValue";
Run Code Online (Sandbox Code Playgroud)

据我所知,第二个static仅在应用程序的生命周期内分配一次,这一事实有助于提高性能.

但这是否意味着它本质上是一个内存泄漏,因为该内存块永远不会被释放?

const每次访问时,第一个声明是否会被分配?

not*_*oop 102

staticObjective-C(和C/C++)中的关键字表示变量的可见性.静态变量(不在方法中)只能在该特定.m文件中访问.另一方面,静态局部变量只被分配一次.

const另一方面,表示不能修改和/或重新分配引用; 并且它与如何创建是正交的(编译器可以优化consts).

值得一提的是,NSString文字被初始化并且在应用程序的生命中永远不会被破坏.它们被分配在内存的只读部分中.


bbu*_*bum 49

静态只是改变了变量的范围,它不是如何申报或存储.

在这两种情况下,编译器都将创建存储在mach-o文件中的NSString实例的常量版本.因此,只有永远一个任意的实例(注意,你可以改变行为造成的Mach-O的负载来动态创建的字符串,但仍然只有一个实例).

static刚刚标志着aVar变量为编译单元的范围内,可见-文件-只.如果没有static,您可以extern NSString *aVar;在某个地方重新声明字符串,并可以从任何地方访问它.

const是正交的,在NSString的情况下,参考几乎是完全无关紧要的.

  • 实际上`const`并不是完全无关紧要的 - 它会阻止你将`aVar`改为指向不同的NSString对象. (6认同)
  • 谢谢.这一点:'你可以将字符串重新声明为extern NSString*aVar; 在一个标题的某个地方,可以从任何地方访问它'真的把它开回家给我. (3认同)

Ale*_*ekh 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关键字会使变量名称成为全局变量,并可能导致应用程序中的名称冲突.