Objective-C学习总结#1——函数与变量的语法特性
来源:互联网 发布:什么手机壳防摔 知乎 编辑:程序博客网 时间:2024/06/04 21:40
Objective-C学习总结#1——函数与变量的语法特性
Objective-C是一种以C为基础,并集合Smalltalk特征扩展出来的面向对象的语言。在本章节中主要记录总结OC中函数与变量的C语言特性。
- Objective-C学习总结1函数与变量的语法特性
- 全局变量和局部变量
- 外部全局变量和内部全局变量
- 内部函数和外部函数
- clang编译
- 动态存储和静态存储
全局变量和局部变量
全局变量:
在函数外部定义的变量是全局变量,全局变量可以被该源文件中的所有函数访问,它的作用域为:从定义该变量的位置开始,到该资源程序结束。局部变量:
在函数内部定义的变量是局部变量,局部变量只能在该函数内部有效,只能在该函数内使用它们,白函数外部无法访问这些变量。
外部全局变量和内部全局变量
外部全局变量
在函数外定义,不被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
局部变量处理。
- Objective-C学习总结#1——函数与变量的语法特性
- objective-c的语法—函数名
- 【IOS 开发学习总结-OC-7.5】objective-c 的c语言特性——结构体
- 【IOS 开发学习总结-OC-7.2】C 语言特性——局部变量与全局变量
- Objective-C基础——语法总结
- Objective-C基础——核心语法-点语法法和成员变量的作用域
- Objective-c——理解与特性
- 【IOS 开发学习总结-OC-7.10-★】 objective-c——函数与指针
- 【IOS 开发学习总结-OC-12】★objective-c面向对象之——合成存取方法与点语法
- 【Objective-C学习笔记】核心语法——实例变量作用域、关键字@property和@synthesize
- Objective-C开发——最简单的Objective-C程序与基础语法解析
- Objective-C 基本语法:实例变量与成员变量的区别
- Objective-C 基本语法:实例变量与成员变量的区别
- Objective-C 基本语法:实例变量与成员变量的区别
- Objective-C 基本语法:实例变量与成员变量的区别
- objective-c 新语法特性
- 黑马程序员——Objective-C——点语法、变量的作用域
- Objective-C—self 、super、点语法、成员变量的作用域、@property和@synthesize、id
- HTML5标签构成
- tar包的解压 和压缩
- 论文解读:Multi-view Clustering via Joint Nonnegative Matrix Factorization
- Linux下vsftpd安装配置与使用
- Java实现将txt文件转成xls文件
- Objective-C学习总结#1——函数与变量的语法特性
- SpringBoot应用部署到Tomcat中无法启动问题
- tensorboard可视化使用
- MYSQL:指定时间删除过期数据
- linux操作数据库
- 在Ubuntu14.04上快速部署OpenStack
- 2.CyclicBarrier简介
- LoadRunner中文乱码
- 283. Move Zeroes