static
有时希望函数中局部变量的值在函数调用后不消失而继续保留原值,以便在下一次调用的时候该变量已经有值。这时就该指定该局部变量为静态变量,用static关键字进行声明。
-
修饰局部变量
- 让局部变量只初始化一次
- 局部变量在程序中只有一份内存,其分配在静态存储区,该变量在整个程序执行期间不释放,其分配的控件始终存在。
- 并不会改变局部变量的作用域,仅仅是改变了其生命周期(程序结束,局部变量销毁)
-
修饰全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用,单例中的static就是这种用法。
const
const是C/C++中的一个关键字(修饰符),const一般用来定义一个常量,既然叫做常量, 即以后再也不能修改其值。
- 通常const常量有四种写法:
static const NSString *str = @"666哈哈哈";
const NSString * str = @"666哈哈哈";
NSString const * str = @"666哈哈哈";
NSString * const str = @"66哈哈哈";
- const有条原则, 那就是他右边是什么, 什么就不可变, 如下
-
const的作用:限制类型
- const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)
- 被const修饰的变量是只读的
-
static和const联合使用
作用:声明一个只读的全局静态变量,在iOS中把一个经常使用的字符串常量定义为全局只读静态变量,用来代替宏。 -
实际开发中,一般会专门建一个类来存放常量。
#define
宏定义, 则是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换。
-
const与宏的相同点
都可以定义常量 -
const与宏的不同点
-
编译器处理方式不同
define是在预处理阶段展开的。
const常量是在编译运行阶段使用的。 -
类型和安全检查不同
define宏没有类型,不做任何的安全检查,仅仅是展开。
const常量是有具体类型的,在编译阶段会执行类型的检查。 -
存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
const常量会在内存中分配,但只有一份内存空间,就算项目中N处用到,也不会分配N块内存空间。 -
效率不同
宏占的只是代码段而已,大量用宏会导致二进制文件变大。
而编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高。
-
所以在项目中定义常量,用const要比用宏好的多,但是宏有自己独特的作用:
- 宏能定义函数
- OC的单例模式用到宏
- 宏还能根据传入的参数生成字符串
总结
在Objective-C中, 随处可见const常量, 所以大家应该大胆地使用const, 它会带给你大大的益处. 同时, 只要某个数据是定义之后永远都不需要也不能修改的, 请使用const!
网友评论