3、static
- 修饰局部变量
- 1、使得局部变量只初始化一次
- 2、局部变量在程序中只有一份内存
- 3、局部变量的作用域不变,但是生命周期变了(直到程序结束才销毁) - 修饰全局变量
- 1、全局变量的作用域仅限当前文件
- 2、避免重复定义全局变量
4、extern作用:
- 只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
- 先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。
// 全局变量:只有一份内存,所有文件共享,与extern联合使用。
int a = 20;
// static修饰全局变量
static int age = 20;
- (void)test
{
// static修饰局部变量
static int age = 0;
age++;
NSLog(@"%d",age);
}
- (void)viewDidLoad {
[super viewDidLoad];
[self test];
[self test];
extern int age;
NSLog(@"%d",age);
}
5、static与const联合使用
- static与const作用:声明一个只读的静态变量
- 开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合
// 开发中常用static修饰全局变量,只改变作用域
// 为什么要改变全局变量作用域,防止重复声明全局变量。
// 开发中声明的全局变量,有些不希望外界改动,只允许读取。
// 比如一个基本数据类型不希望别人改动
// 声明一个静态的全局只读常量
static const int a = 20;
// staic和const联合的作用:声明一个静态的全局只读常量
// iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.
// 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。
static NSString * const key = @"name";
// 如果 const修饰 *key1,表示*key1只读,key1还是能改变。
static NSString const *key1 = @"name";
6、#define
#define ANIMATION_DURAION 0.5
但是代码中并没有定义出常量的类型信息, duration这个词看上去和时间有关, 但是代码中, 又未明确指出
预处理指令会把碰到的所有ANIMATION_DURAION一律替换为0.5
要想解决此问题, 可以利用编译器的某些特性, 代码如下:
static const NSTimeInterval kAnimationDuration = 0.5;
这样定义的好处:
1.清晰的描述了常量的含义, 可以知道常量类型为NSTimeInterval, 这有助于为其编写开发文档
注意: 这里有一个命名习惯, 如果常量局限于"编译单元"(stranslation unit, 也就是实现文件之内), 则在字母前加字母k, 如果在类之外, 则通常以类名为前缀
总结:
- 不要用预处理指定定义常量, 因为不含类型信息, 而且有人修改了常量值也不会报错
- 在实现文件中使用static const来定义"只在编译单元内可见的常量", 由于此类常量不会在全局符号表中, 所以无需在命名时加前缀
- 在头文件中使用extern来声明全局常量, 并在相关实现文件中定义其值, 这种常量要出现在全局符号表中, 其名称最好用相关的类名做前缀