const
- const用来修饰右边的基本变量或指针变量
- 被修饰的变量只读,不能被修改
/** 可以改变指针的指向 但是不能改变指针指向的内容 不能改变值*/
NSString * const kHomeBottomTitle1 = @"kHomeBottomTitle1";
/** 可以改变指针指向的内容 但是不能改变指针的指向 值可变*/
const NSString * kHomeBottomTitle2 = @"kHomeBottomTitle2";
/** 指针的指向 指针指向的内容都不可改变 不能改变值*/
const NSString * const kHomeBottomTitle3 = @"kHomeBottomTitle3";
static
- 修饰局部变量
在方法体内,声明为静态的变量(局部静态变量)。保证局部变量永远只初始化一次,在程序的运行过程中永远只有一份内存,生命周期类似全局变量了,但是作用域不变。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//声明一个局部变量i
static int i = 0; //每次点击view来到这个方法时让i自增
i ++; //打印结果
NSLog(@"i=%d",i);
}
//i每次都会递增,因为只初始化一次
- 修饰全局变量
在源文件内(但在方法体外),全局静态变量。变量的内存只被分配一次,使全局变量的作用域仅限于当前文件内部,即当前文件内部才能访问该全局变量。从面向对象的角度出发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,又要求对外不可见的时候,就可以使用static。
@implementation LoginTool
//static修饰全局变量,让外界文件无法访问
static LoginTool *_sharedManager = nil;
+ (LoginTool *)sharedManager {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedManager = [[self alloc] init];
});
return _sharedManager;
}
- 修饰函数(很少用到)
static修饰函数时,被修饰的函数被称为静态函数,使得外部文件无法访问这个函数,仅本文件可以访问。
extern
- 声明外部全局变量。这里需要特别注意extern只能声明,不能用于实现。且仅仅是暗示这个变量可能是在别的源文件中定义过的,没有其他作用。
h中声明
extern NSString * const kHomeBottomTitle1;
.m中定义
NSString * const kHomeBottomTitle1 = @"kHomeBottomTitle1";
注意:不可直接在.h文件中直接定义变量即:
extern NSString * const kHomeBottomTitle1 = @"kHomeBottomTitle1";
因为如果在.h里面定义,当全局变量被多个文件使用时,需要多次包含.h头文件,这样会导致重复定义这个全局变量