Const
const修饰常量 被const修饰的属性不能改变:
/// 普通变量
NSString * str = @"变量字符串";
str = @"改变变量";
str是一个指针 当他赋值给“改变变量”就是str的指针指向发生了改变 “改变变量” 是有自己的内存地址
const 修饰的指针,str1指向的地址不可改变,但是str1指向地址的内容可以改变。
NSString * const str1 = @"常量字符串";
str1 = @"尝试改变常量"; /// 这句代码会报错://Cannot assign to variable 'str1' with const-qualified type 'NSString *const __strong'
&str1因为被const修饰是固定的不可被改变的 但是 "常量字符串" 所在的内存地址是**可以**被改变的,如果改变地址内容则访问str1则为改变后的内容
str2指向地址的内容不可改变,但是str2指向的地址是可以改变的
NSString const * str2 = @"常量字符串";
const NSString * str2 = @"常量字符串";
//上述操作没有区别
str2 = @"尝试改变常量";
&str2是可以被改变的但是"常量字符串" 所在的内存地址是**不可以**被改变
str2可以指向其他地方就是当重新赋值不会报错 但是那块内存地址是不会改变的字符串依然是 “常量字符串”
static和exetrn
static
在全局变量前加static,全局变量就被定义成为一个全局静态变量,全局变量和静态全局变量的生命周期是一样的,都是在静态区,在整个工程执行期间内一直存在)全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
特点如下:
1)存储区:有栈变为静态存储区rw data,生存期为整个源程序,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,
但不能使用它;
2)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用
好处:
1)其他文件中可以定义相同名字的函数,不会发生冲突
2) 静态函数不能被其他文件所用。
exetrn
只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量(先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。)
static和const 联合使用
开发中常用static修饰全局变量,只改变作用域,为什么要改变全局变量作用域,防止重复声明全局变量。
开发中声明的全局变量,有些不希望外界改动,只允许读取。
比如一个基本数据类型不希望别人改动
声明一个静态的全局只读常量
static const int a = 20;
staic和const联合的作用:声明一个静态的全局只读常量
iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.
// 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。
static NSString * const key = @"name";
// 如果 const修饰 *key1,表示*key1只读,key1还是能改变。
static NSString const *key1 = @"name";
extern与const联合使用
开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合
因为 static与const组合:在每个文件都需要定义一份静态全局变量。 extern与const组合:只需要定义一份全局变量,多个文件共享。
宏跟Const的优劣
总结
被const修饰的指针 如果是 const * p 则p的指向可以改变 但是他指向的内存地址不能改变(比如这块内存地址定义一个字符串不可以被重新赋值),如果是 * const p 则是 p的指向不可以改版,但是他的内存地址的内容共可以改变。
被static修饰的全局变量只能在局部生效,但是生命周期为整个app的生命周期即使出了作用域他一直存在。
exetrn则是用来获取全局变量(包括全局静态变量)的值不能主动赋值
网友评论