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的情况下,参考几乎是完全无关紧要的.
为了解决所有可能的讨论需求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关键字会使变量名称成为全局变量,并可能导致应用程序中的名称冲突.
| 归档时间: |
|
| 查看次数: |
12903 次 |
| 最近记录: |