const vs Objective-C中的静态NSStrings

时间:2009-11-27 23:51:09

标签: objective-c cocoa cocoa-touch

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

NSString * const aVar = @"aVarStringValue";

static NSString *aVar = @"aVarStringValue";

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

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

并且每次访问时都会分配第一个const声明吗?

3 个答案:

答案 0 :(得分:98)

Objective-C(和C / C ++)中的

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