这两行代码都在实现文件中,在 @implementation
声明之前。
NSString * const aVar = @"aVarStringValue";
static NSString *aVar = @"aVarStringValue";
据我所知,第二个static
只在应用程序的生命周期中分配一次,这事实有助于提高性能。
但这是否意味着它本质上是内存泄漏,因为那块内存永远不会被释放?
而第一个const
声明则会在每次访问时分配吗?
这两行代码都在实现文件中,在 @implementation
声明之前。
NSString * const aVar = @"aVarStringValue";
static NSString *aVar = @"aVarStringValue";
据我所知,第二个static
只在应用程序的生命周期中分配一次,这事实有助于提高性能。
但这是否意味着它本质上是内存泄漏,因为那块内存永远不会被释放?
而第一个const
声明则会在每次访问时分配吗?
static
关键字在Objective-C(和C / C ++)中表示变量的可见性。静态变量(不在方法中)只能在特定的.m
文件内访问。另一方面,静态局部变量只会被分配一次。
const
则表示引用不能被修改和/或重新赋值;并且与它的创建方式无关(编译器可能会优化常量)。
值得一提的是,NSString
文字初始化后在应用程序生命周期内永远不会被销毁。它们分配在内存的只读部分。
static 只改变了变量的作用域,而不影响其如何声明或存储。
在这两种情况下,编译器将创建一个常量版本的 NSString 实例并将其存储在 mach-o 文件中。因此,只有一个实例(请注意,您可以更改行为以导致字符串在加载 mach-o 时动态创建,但仍然只有一个实例)。
static
只是将 aVar
变量标记为在编译单元 - 即文件 - 内可见。如果没有 static
,则可以在某个头文件中重新声明字符串为 extern NSString *aVar;
并从任何地方访问它。
const
是相互独立的,在 NSString 引用的情况下,几乎完全不相关。
const
并非完全无关紧要 -- 它防止您将 aVar
更改为指向不同的 NSString 对象。 - David Hullstatic
和位置的讨论,根据 C99/GNU99 规范(通常用于 Objective-C 代码):
static
是存储类说明符
默认情况下,具有文件级别作用域的对象具有外部链接性
const
是类型限定符(是类型的一部分)
应用于左侧实例 - 即
MyObj const * myVar;
- 非限定指向常量限定对象类型的指针
MyObj * const myVar;
- 常量限定的非限定对象类型的指针
最左边的用法 - 应用于对象类型,而不是变量
const MyObj * myVar;
- 非限定指向常量限定对象类型的指针static NSString * const myVar;
- 内部链接的不可变字符串常量指针。
如果没有使用 static
关键字,变量名称将成为全局变量,并可能导致应用程序中的名称冲突。
NSMutableArray * const myArray = [NSMutableArray new];
。我从未在此情况下使用过 const
,现在我很困惑是否一直都用错了? - MrBr