Coding_Kid的博客通过本文主要向大家介绍了全局变量,局部变量,const等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
类里方法外、类外直接写NSString * str = @“xxx”; str是全局变量(面向对象中,要使用全局变量,一般设置成类的属性)
局部变量:
写在类里方法内的变量是局部变量。
注意:
const、static、extern只是三个变量修饰符
const决定变量能不能被改变
static可以决定变量的生命周期
extern可以想不到什么用处的跨文件传值?…
至于变量的作用域,跟它们没关系,只能变量定义的地方有关。
const常量(只读)
(当不希望别人修改这个变量值的时候用,写在pch中可以起到宏的作用)
位置可以随便写
const作用
1. 用于修饰右边变量(基本变量,指针变量)
2. 被const修饰变量只读
const与宏的区别
1. 编译的时刻不一样: 宏:预编译 const:编译
2. 编译检查:宏不会做编译检查 const会
3. 宏的好处:宏可以定义函数和方法 const不可以
4. 宏坏处:大量使用宏,会导致预编译时间过长
常量指针与指针常量的区分:
看指针*号 与 const 的先后顺序
const在*号前面,表示里面存的是常量值,const int * a = &b; 可以直接改b的值,但是不能通过*a改,编译器认为a里是个常量
*号在const前面,表示这个创建的指针变量不能再被赋值,int * const a = &b,a不能再赋值其他的地址
相关题目
int * const p1; // p1:只读 *p1:变量
(const int) / (int const) *p2; // p2:变量 *p2:只读
(const int) / (int const) * const p4; // p4:只读 *p4:只读
iOS中const的位置
const在iOS中修饰字符串,const的位置在哪都无所谓的,因为重新赋值都会报错
原因,比如:
const NSString * str = @“ss”; / NSString * const str = @“ss”;
如果再赋值 str = @“string”,都会报错
因为 str = @“string” 本质上干了两件事:
1.将str的内存地址改成@“string”的地址
2. 将str内存中存的值改为string
所以不管const位置在那,重新赋值都有问题。
生命周期
存在常量数据区,与应用程序生命周期相同
const在开发当中的使用
1. const替换宏,宏:常用字符串或者基本数据定义成宏 -> const
2. 修饰方法参数,让方法参数只读
static(提升生命周期):
如果有时候希望类里某个变量拥有整个app运行期间一般长的声明周期时,控制器销毁,变量依旧存在的时候,用这个修饰)
作用域(不会改变变量作用域):
修饰局部变量,只要被static修饰局部变量,这个局部变量的声明周期就会延长(整个app运行过程中都在),作用域不变
修饰全局变量,只要被static修饰全局变量,这个全局变量只能在当前文件下使用
分配时刻:
程序一运行的时候就会分配内存
生命周期:
程序运行期间一直存在
static修饰的变量,只是在编译的时候进行初始化赋值,运行的时候就不会再运行这句代码。
注意点:
在c99中指明全局变量和static变量的初始化式必须为常量表达式
static NSArray * array = @[] / [NSArray array] 错误: initializer element is not a compile-time constant
只能:
static NSArray * array;
其他地方赋值
static NSString * str = @“” 这个是可以的,NSString总是特殊
extern(跨文件使用)
extern修饰的变量,名字全局内不能相同,否则报错:变量重定义)
使用方式(跨文件使用):
A类有个属性:int a = 8; // 类外,类内:方法外。
B类中想要使用:extern int a ; // 位置随便,类外,类内:方法内,方法外
这个时候A中的值,B就能获取,而且还能修改。一旦修改之后,A文件中a的值也变了
作用域
全局作用域(只需要在一个源文件中定义,就可以作用于所有的源文件)
生命周期
程序运行期间一直存在
static和const联合使用
static const NSString * reuseId = @“reuseId”; // 在当前文件内可用的只读变量
开发中是如何避免重复定义?
做法:只要定义全局变量,都不能再自己的类中定义,一般开发中,我们会搞一个公共的const文件来定义全局变量