设为首页 加入收藏

TOP

Objective-C学习总结——函数与变量的语法特性
2017-12-14 14:31:39 】 浏览:222
Tags:Objective-C 学习 总结 函数 变量 语法 特性

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局部变量处理。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c语言指针基础之指针和数组的关系 下一篇C语言和指针使用之条件操作符、计..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目