开门见山,直入主题!
一:const
iOS 开发中 经常会用到 const
关键字,那么我们应该怎么理解它呢?
const
可以用来修饰基本数据类型(int
),指针(*p
),OC对象(NSString
)等,被const
修饰的变量只会编译一次,且被修饰的变量不能被再次修改,否则会报错!
举个栗子说明一下:
1.修饰变量
const int a = 10;
a = 1;
和
int const a = 10;
a = 1;
两种写法是一样的效果,此时const都是来修饰变量a
的;此时Xcode会这样报错
2.修饰指针
- 直接修饰指针
int * const a = 10;
int *b = 20;//定义一个int型指针b,指向 20 ;
//此时 *a 访问到的变量的值不可变; eg:
a = b;
此时Xcode会报错如下:
因为此时
const
修饰指针a
,所以a
就不能被修改,此时*a
是可以被修改的,可以自己试一下,加深一下印象.
- 修饰指针所指的变量
int const *a = 10;
//此时 *a 访问到的变量的值不可变; eg:
*a = 20;
此时Xcode会报错如下:
此时
const
修饰是指针所指变量,此时指针a
其实可以修改的.
3.修饰OC对象
NSString *const name = @"xql";
name = @"new";
此时Xcode会报错如下:
此时
name
是不可修改的,苹果官方代码中也能经常看到这样的用法,声明一个只读变量:二:宏
说到const
,经常拿来和宏
对比,那么它们有什么区别呢:
- 用宏定义的变量是预编译的,即打开工程的时候就会编译宏代码,过多的宏定义会加长编译时间(
用宏定义的变量也不会导致内存的增加,也是只会分配一份内存,只是增加了编译时间!!!
),所以常用的字符变量通常用const就可以了; - 宏可以定义可定义一段代码,const不能;
- 宏在编译时不会检查代码书写错误,const修饰变量编译时会自动检查书写是否正确;
三:static和extern
接下来对比着看一下static
和extern
static
static
可以修饰局部变量,也可以修饰全局变量
- 1.修饰局部变量时会延长局部变量的生命周期只要程序启动后局部变量就会一直存在,而不会在作用域结束处销毁变量
举个栗子:
-(void)count{
static int i = 0;
i++;
}
多次调用-count
方法,不用static修饰时,i
会在count方法结束时销毁从而起不到计数作用,用static修饰后i
会一直存在直到杀死程序,此时i
就能起到计数作用;因为被static
修饰的变量会在程序启动时就分配空间(不是等到执行方法时才分配,可自己动手敲代码试试
),以后程序运行的整个周期内就不会再分配空间了
- 修饰全局变量时会定义该全局变量的作用域只能是当前文件夹,哪怕在别的文件内部再用
extern
声明也无法访问
- 修饰全局变量时会定义该全局变量的作用域只能是当前文件夹,哪怕在别的文件内部再用
extern
extern是用来声明全局变量的,只是声明,而不能定义变量,即不能给声明的变量赋值;当在a文件内声明一个全局变量 int a = 3;
(默认是带有extern修饰符的);在没有引用a
文件的b
文件内,只要用 extern再次声明一下(extern int a;
)就可访问a
文件内部的变量a
;且与 a文件 和 b文件 的加载顺序无关.