objective-C:全局变量、静态变量、常量的区别

全局变量

- 什么是全局变量

全局变量即该变量不仅可以在所定义的文件内被访问,也可以在其他文件中被访问。凡是定义在函数或方法之外的变量(除静态变量之外)都是全局变量。

- 使用方法

为了维护方便及可读性,全局变量一般定义在源文件(.m)的起始位置。其他文件想使用该全局变量时,需要先使用关键字extern进行声明。全局变量可以多次声明,为了方便,一般会在定义该全局变量的文件的头文件(.h)中声明,其他文件需要使用该全局变量时,直接import该头文件(.h)即可。

- 全局变量为什么不能定义在头文件中

全局变量,也叫外部全局变量,是整个工程唯一但,且只能定义一次,所以全局变量不可定义在头文件(.h)中,如果有多个文件import了一个定义了外部全局变量的头文件,那么整个工程中就会出现多个同名同类型的全局变量,此时编译器会报错“x duplicate symbols”,x的值取决于多少个文件import了定义该全局变量的文件。

- 存储位置

全局变量保存在内存的全局(静态)存储区中,可多次改变值,无赋值时为nil。

静态变量

- 什么是静态变量

当我们希望一个变量不仅仅是作用于某个对象,而是作用于整个类的时候,这时候就可以使用静态变量。静态变量用static修饰,是一个私有的全局变量,所以静态变量也被称为内部全局变量,意思是静态变量在所定义的位置是全局的,但是不可以被其他文件访问。

- 定义位置与作用域

静态变量的作用域是与它定义的位置有关,定义在文件中它的作用域就是整个文件,定义在方法内,它的作用域就是该方法。静态变量定义在方法内时,该方法或函数不管被调用多少次,都共享一个变量。类方法、实例方法、函数都可以使用静态变量。

- 静态变量为什么不能定义在头文件中

同样的,静态变量不推荐定义在头文件中,如果多个头文件定义了同样名称的静态变量,编译时会报错“重复定义”。就算不重复定义,而是在b文件使用a文件定义的静态变量,其实使用的也不是同一个静态变量,而是在b文件里面定义了一个同名的静态变量,它们各自享有着独立的内存空间。所以静态变量一定要定义在源文件中。

- 存储位置

静态变量跟全局变量一样,都保存在全局(静态)存储区中。

常量

常量使用const修饰,在定义的时候就必须初始化,初始化好以后值不可改变,如果没有初始化,数值型的常量会被系统自动赋值为0,对象型的常量则为nil。

- 定义语法

定义一个非对象类型的常量的语法为

const NSTimeInterval myTimeDuration = 0.5;

如下定义的效果与上面一致,

NSTimeInterval const myTimeDuration = 0.5;

当我们定义一个对象类型的常量时,应把const放在*(指针指向符)之后,此时表示指针指向的内存的内容不可变的,语法为

NSString * const myName = @"someString";

下面两种定义方式,表示指针指向的内存地址是不可变的,而内存保存的内容是可变的。

NSString const * myName = @"someString";
const NSString * myName = @"someString";
- 全局常量与静态常量

当常量定义在函数和方法之外时,即为全局常量,可被其他文件所使用,使用方法跟全局变量一样,const也可修饰静态变量。不管是全局常量,还是静态常量,值都不可改变。

- 常量也不能定义在头文件中

常量也一样要定义在源文件中,如果定义在头文件中,编译时会报错“x duplicate symbols”,x的值取决于多少个文件import了定义该常量的文件。

- 存储位置

常量的存储区域同全局变量、静态变量。

内存分区

程序对内存的使用分为以下几个区:

  • 栈区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值等。函数执行结束时这些存储单元自动被释放。效率高,但分配的内存容量有限。
  • 堆区(heap):亦称动态内存分配,一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。如果没有及时释放不再使用的动态内存,我们认为发生内存泄漏。
  • 全局区(static):该区的内存在程序编译的时候就已经分配好,在程序的整个运行期间都存在。内存中所有的字节默认值都是0x00。它主要存放静态数据、全局数据和常量。
  • 文字常量区:常量字符串放在此,程序结束后由系统释放。
  • 程序代码区:存放函数体的二进制代码。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个典型的规划问题,可以使用lingo18软件进行求解。以下是对应的lingo18代码: ``` Model: Sets: shifts /shift1, shift2, shift3, shift4/; times /time1, time2, time3, time4, time5, time6/; Params: demand(time) demand for each time period / time1 20, time2 25, time3 10, time4 30, time5 20, time6 10 /; salary(shift) cost of each shift / shift1 800, shift2 800, shift3 900, shift4 900 /; worktime(shift) work time for each shift / shift1 8, shift2 8, shift3 9, shift4 9 /; resttime(shift) rest time for each shift / shift1 1, shift2 1, shift3 1, shift4 1 /; Variables: x(shift, time) binary decision variables obj total cost to minimize work(shift) total work time for each shift rest(shift) total rest time for each shift workload(time) total workload for each time period Binary Variables: x; Equations: total_cost objective function worktime_con(work(shift)) work time constraint resttime_con(rest(shift)) rest time constraint demand_con(workload(time)) demand constraint Bounds: x(shift, time) binary End: total_cost = sum((shift, time), x(shift, time) * salary(shift)); work(shift) = sum(time, x(shift, time) * worktime(shift)); rest(shift) = sum(time, x(shift, time) * resttime(shift)); workload(time) = sum(shift, x(shift, time)); worktime_con(work) =E= 8; resttime_con(rest) =E= 1; demand_con(workload("time1")) =G= demand("time1"); demand_con(workload("time2")) =G= demand("time2"); demand_con(workload("time3")) =G= demand("time3"); demand_con(workload("time4")) =G= demand("time4"); demand_con(workload("time5")) =G= demand("time5"); demand_con(workload("time6")) =G= demand("time6")); ``` 其中,Sets定义了班次和时间段,Params定义了需求人数、工资、工作时间和休息时间等参数,Variables定义了决策变量,Binary Variables定义了决策变量的值域,Equations定义了约束条件,Bounds定义了决策变量的范围。 在lingo18中执行该代码即可得到最优解,即最小化总工资的情况下满足所有需求的服务人员安排方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值