static
-
修饰局部变量
- 让局部变量只初始化一次
- 局部变量在程序中只有一份内存
- 并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁)
-
修饰全局变量
- 全局变量的作用域仅限于当前文件
const
- 没有const修饰的指针
- 指针p和*p都能被修改
// 定义一个指针变量
int *p = NULL;
// 定义2个int类型的变量
int a = 10;
int b = 30;
// p指向a
p = &a;
*p = 20;
// p指向b
p = &b;
*p = 40;
NSLog(@"%d %d", a, b);
- const修饰的*p
- 被const修饰的*p只能被赋值一次,以后不能赋值,否则编译器报错
// const修饰的*p
const int *p = NULL;
int const *p = null;
*p = 20; // 编译器报错,不能修改*p的值
- const修饰的p
- 被const修饰的p只能存一次地址,以后再也不能其它存地址了,否则编译器报错
// const修饰的指针变量p
int * const p = NULL;
int a = 20;
p = &a; // 编译器报错,不能修改指针变量p
- const在声明字符串的用法
NSString * const ZMJName = @"jack";
static和const联合使用
- static将一个全局变量变成局部变量
- const将一个局部变量变成局部常量
// 定义了一个局部常量
static const CGFloat ZMJRed = 0.4;
static const CGFloat ZMJGreen = 0.6;
static const CGFloat ZMJBlue = 0.7;
使用static const 与 #define
- 使用static const修饰变量和宏定义的比较
- 相同点
- 都不能再被修改
- 一处修改,其它都改了
- 不同点
- static const修饰变量只有一份内存
- 宏定义,只是简单的替换,每次使用都需要创建一份内存
- 相同点
- 结论
- 使用static const修饰更加高效,在同一个文件内可以使用
static const
取代#define
- 使用static const修饰更加高效,在同一个文件内可以使用
// static const修饰变量只有一份内存
static const CGFloat ZMJRed = 0.4;
// 宏定义,只是用0.4替换ZMJRed,每次使用都需要创建一份内存
#define ZMJRed 0.4
const实际开发的应用
- 一般会先新建
ZMJConst.h
文件专门存放常量的引用
// 引用某变量,如果没有使用const修饰,就不能直接在编译的时候就能检测是否修改了ZMJRed
extern const CGFloat ZMJRed;
extern NSString * const ZMJName;
- 可以模仿系统UIKIT_EXTERN来代替extern,逼格更高!
UIKIT_EXTERN const CGFloat ZMJRed;
UIKIT_EXTERN NSString * const ZMJName;
- 一般会新建
ZMJConst.m
文件专门存放static const修饰的变量,需要用的时候导入头文件就可以了。
// 定义了整个程序都能访问的常量
const CGFloat ZMJRed = 0.4;
NSString * const ZMJName = @"jack";
网友评论
static将一个全局变量变成局部变量
const将一个局部变量变成局部常量
static 将全局变量变成局部变量?只是限制作用域,何为变成局部变量呢
extern NSString * const JLoginNotification = @"JLoginNotification";
NSString * const JLoginNotification = @"JLoginNotification";
.h中
extern NSString * const JLoginNotification;
pch中也是
extern NSString * const JLoginNotification;
可以搜搜extern关键字的意义