一.成员变量 : 写在类声明的大括号中的变量叫成员变量 (也叫属性/实例变量)
成员变量不可离开类 离开了类就不是成员变量
成员变量不能再定义的同事初始化
成员量只能通过对象来访问
成员变量存储在堆中(当前对象对应的堆得存储空间中) 不会被系统自动释放 只能有程序员手动释放
二.局部变量 :写在代码块或函数中的变量为局部变量
局部变量的作用域 : 从定义的那一行开始,一直到遇到大括号或return(也就是这个变量所在的代码块或函数结束时)
局部变量可以先定义后初始化,也可以在定义的同时就初始化
局部变量存储在栈里面 系统会自动释放
三.全局变量 : 卸载函数外或大括号外的变量就是全局变量
全局变量的作用域 : 从定义哪行开始 到文件末尾
全局变量可以向定义再初始化,也可以定义的同时初始化
全局变量存储在静态区中 程序启动时就会分配存储空间 直到程序结束才会释放
全局变量与全局静态变量的区别:
(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
(c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用;
静态全局变量的作用:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。
(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
(c) 只能在本文件中使用!具有内部链接的静态;不允许在其他文件里调用;
接下来,Xcode创建一个工程,并且创建一个继承于UIView的MyView(为了验证在两个不同的 .m 文件中全局变量和静态全局变量的使用):
1 两个.m文件中同样的全局
我的理解是:同一个工程中,两个不同 .m 文件中同样的全局变量不能同时存在,因为这样在编译或运行的时候,编译器分不清是哪个全局变量,所以我们千万不能同时在同一个工程中定义同样的全局变量!
2 一个.m文件使用另一个.m文件中的全局变量
问题来了,如果我就是想用另一个 .m 文件中的全局变量,那怎么处理呢?很简单,使用关键字 extern 修饰使用的全局变量就好了,也即是在
import “ViewController.h”中:
//加上关键字extern,表示这里要使用到MyView中的全局变量
extern NSInteger CellHeight;
打印结果:0。因为当没有初始化的时候系统默认:零。
注:如果在MyView中初始化了数据,比如NSInteger CellHeight = 100;则打印结果就为100,但是在ViewController中就不能再次初始化!!!否则编译报错同上!!!
3 静态全局变量
显然,依旧报错!这是因为在MyView中是一个静态全局变量,尽管在ViewController使用了关键字extern想使用它,但还是不行的,静态全局变量只能在本文件中使用,不允许其他文件的调用!换句话说我们可以在两个不同的 .m 文件中定义同样的静态全局变量,而互不干涉、互不影响。