static和const的使用
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只能存一次地址,以后再也不能其它存地址了,否则编译器报错
int * const p = NULL; int a = 20; p = &a; // 编译器报错,不能修改指针变量p
- 例子:开发中常常遇见下面的例子
NSString * const LJID = @"upliver";
static和const的联合使用
- static是将一个全局变量变成了局部变量
- const是将一个局部变量变成了局部变量
// 定义了一个局部常量
static const CGFloat LJRed = 0.4;
static const CGFloat LJGreen = 0.6;
static const CGFloat LJBlue = 0.7;
使用static const 与 #define
- 相同点
- 都不能被在修改了
- 一处修改,其它都改了
- 不同点
- static const修饰的变量只有一份内存
- 宏定义,只是简单的替换,每次使用都需要创建一份内存
- 结论
- 使用static const 更加的高效,在同一个文件内可以使用static const 取代#define
// static const修饰变量只有一份内存 static const CGFloat LJRed = 0.4; // 宏定义,只是用0.4替换LJRed,每次使用都需要创建一份内存 #define LJRed 0.4
重点const在开发中的应用
- 一般会新建一个LJConst.h文件专门用来常量的引用
// 引用某变量,如果没有使用const修饰,就不能直接在编译的时候就能检测是否修改了LJRed extern const CGFloat LJRed; extern NSString * const LJName; // 可以模仿一下苹果官方 UIKIT_EXTERN const CGFloat ZMJRed; UIKIT_EXTERN NSString * const ZMJName;
- 一般会新建LJConst.m文件专门存放static const修饰的变量,需要用的时候导入头文件就可以了。
// 定义了整个程序都能访问的常量 const CGFloat LJRed = 0.4; NSString * const LJName = @"jack";
最后再多补充一下extern的用法
- 对于extern来说,可以理解为扩展吧,是这样的,是从一个类扩展到另一个类中的
- 在SplashViewController.m中定义一个变量是这样的
#import "SplashViewController.h"
NSString* meString=@"123";
@implementation SplashViewController
// NSString* meString=@"123";
// 上面两个位置都行
- 如果在另外的类iTennisViewController.m中要用到这个类中的meString时只需在iTennisViewController.m中写成这样
#import "iTennisViewController.h"
extern NSString* meString;
@implementation iTennisViewController
即可
- 这样你在iTennisViewController.m中直接打印meString,你会发现 是123,当然你也可以对meString重新斌值 ,就是说meString虽然定义在SplashViewController.m中但好像是公共的,也称为全局变量吧
参考资料:
@吃不完兜着走
@zhazha