欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Objective-C学习总结——函数与变量的语法特性

程序员文章站 2022-04-12 21:53:14
Objective-C学习总结——函数与变量的语法特性 Objective-C是一种以C为基础,并集合Smalltalk特征扩展出来的面向对象的语言。在本...
Objective-C学习总结——函数与变量的语法特性

Objective-C是一种以C为基础,并集合Smalltalk特征扩展出来的面向对象的语言。在本章节中主要记录总结OC中函数与变量的C语言特性。

全局变量和局部变量

全局变量:
在函数外部定义的变量是全局变量,全局变量可以被该源文件中的所有函数访问,它的作用域为:从定义该变量的位置开始,到该资源程序结束。

局部变量:
在函数内部定义的变量是局部变量,局部变量只能在该函数内部有效,只能在该函数内使用它们,白函数外部无法访问这些变量。

外部全局变量和内部全局变量

外部全局变量
在函数外定义,不被static修饰的,允许被其他源程序访问的全局变量被称为外部全局变量。

内部全局变量
如果希望全局变量的作用域限制在该源程序内部,则可使用static修饰该全局变量,这样就可以避免其他源程序访问或修改该全局变量。这种使用了static修饰的全局变量被称为内部全局变量。

注意:调用全局变量前需先声明变量的两种情况:
1. 全局变量是在其他源文件中定义的
2. 全局变量是在调用处的后面定义的

内部函数和外部函数

内部函数
定义函数时使用static修饰,该函数只能被当前源文件中的其他函数所调用,这种函数被称为内部函数。

外部函数
定义函数时使用extern修饰,或者不适用任何修饰符修饰。它可以被任何源文件中的函数调用,这种函数被称为外部函数。

clang编译

假定有main.m和function.m两个源文件,其中main.m源文件中含有main方法,且mian函数中调用了function.m源文件中的函数或全局变量,则可执行如下命令:

clang -fobjc-arc -framework <使用到的框架> function.m main.m

以上命令将会把两个源程序编译并连接到一起,最终生成一个可执行文件。

需要特别注意的是,如果在main.m中使用#import "function.m"来导入指定的源文件,则意味着会将function.m文件中的代码放入到main.m文件的前面,作为一个整体进行编译,此时有两点需要注意。
1. 使用clang 命令执行编译时,只要编译main.m文件即可。
2. main.m中定义的函数和全局变量)都会被看成与main.m位于同一个文件中,及时是static修饰的内部函数或内部全局变量,main.m程序也依然可以调用它们。

动态存储和静态存储

就C程序运行的内存来说,大致可分为三部分:程序区、静态存储区和动态存储区。

静态存储:程序在运行期间根据需要动态分配内存的存储方式。
C程序中的变量要么存放在静态存储区,要么存放在动态存储区。静态存储区的变量会在程序运行开始时分配内存,指导程序运行结束才释放内存,在程序运行过程中,静态存储区的变量总是占据固定的内存。静态存储区会存放如下两类变量。

全局变量:无论是内部全局变量,还是外部全局变量,它们都被保存在静态存储区。 static修饰的局部变量。

动态存储:程序在运行开始就分配固定内存的存储方式。
动态存储区的变量所在的存储空间是动态分配的,当程序多次调用同一个函数时,该函数内的局部变量(非static修饰的变量)每次都会动态分配内存空间,每次函数结束时就会自动释放这些内存空间,这种分配和释放都是动态的。如果一个程序多次调用同一个函数,那么程序每次分配该该函数的局部变量的存储空间可能都是变化的。动态存储区主要存放如下三类数据。

函数的形参变量。 非static修饰的局部变量。 函数执行的现场数据以及返回地址等。

存储类别
为了指定变量的存储类别,可以在定义变量时指定存储类别。C语言支持如下几种存储类别。

auto:指定该变量采用自动存储机制。局部变量默认采用这种存储机制。

static:指定局部变量存放在静态存储区。如果希望某个局部变量的值在函数调用结束后依然可以保留,则可用static修饰该局部变量。考虑使用静态局部变量的情况有如下两种:

需要变量能保留上一次调用结束时的值。 如果希望变量只被初始化一次,以后只是被调用,而不希望对其重新赋值,则可以考虑使用静态局部变量。

register:指定将该变量存放在寄存器内——无须将该变量存入内存,从而可以避免CPU频繁地读/写内存,因此可以对那些频繁使用的局部变量使用register修饰。但是用register修饰的变量可以提升性能只是理论上的,实际上存在如下两个限制。

计算机中寄存器的数量是有限的,不能定义任意多个寄存器变量。 不同系统对register局部变量的处理是不同的,许多系统并不会真正把register局部变量存入寄存器,它们依然把register局部变量当成auto局部变量处理。