1.extern
外部变量,可置于变量或函数前,作用域是整个项目
注意:extern只能声明,不能用于实现。
#import <UIKit/UIKit.h>
@interface Data :NSObject
extern NSString *const name;
@end
#import "Data.h"
@implentment Data
NSString *const name=@"洋洋";
@end
#import <UIKit/UIKit.h>
@interface ViewController :UIViewController
@end
#import "ViewController.h"
@implementation ViewController
-(void)viewDidLoad
{
NSLog(@"%@",name);
}
@end
2.static
内部变量(静态变量)
a.修饰全局变量,作用域仅限于当前文件内部
作用:static定义的全局变量,extern引用也获取不到其值
b.修饰局部变量
作用:某个函数调用频率比较高并且某个变量值固定不变可以使用
保证局部变量永远只初始化一次,直到程序销毁时才释放,即为该变量分配的空间在整个程序的执行期内都始终存在
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
int i=0;
i++;
NSLog(@"%d",i);
}
2017-02-07 15:41:35.415 WeChat[3107:167112] 1
2017-02-07 15:41:35.909 WeChat[3107:167112] 1
2017-02-07 15:41:36.317 WeChat[3107:167112] 1
2017-02-07 15:41:36.549 WeChat[3107:167112] 1
从输出日志中我们可以看到i一直等于1,因为每次点击进入这个方法就会重新初始化一个全新的变量i = 0,加了一次后值变为1,然后打印出结果为1,出了这个方法后局部变量i就被释放回收,所以每次打印出来的结果都为1。
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
static int i=0;
i++;
NSLog(@"%d",i);
}
2017-02-07 15:42:39.754 WeChat[3122:168278] 1
2017-02-07 15:42:40.360 WeChat[3122:168278] 22017-02-07 15:42:40.808 WeChat[3122:168278] 3
2017-02-07 15:42:41.208 WeChat[3122:168278] 4
上面日志中可以看到i的值一直在自增,这就是关键字static修饰的局部变量的作用,让局部变量永远只初始化一次,一份内存,生命周期已经跟全局变量类似了,只是作用域不变。
3.const
a.const用来修饰右边的基本变量或指针变量
b.被修饰的变量只读,不能被修改
int const *p //*p只读,p变量
int *const p //p只读,*p变量
const int *p //*p和p都只读
int const *const p //*p和p都只读
const右边是谁,则谁就不可变