写在前面:花了近2个小时,就为了弄懂一下Objective-C中的全局变量和static静态全局变量的区别,好吧,程序猿没有废话,开门见山。
首先,网上查了一下全局变量和静态全局变量的总结,觉得这个总结不错:
全局变量与全局静态变量的区别:
(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
(c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用;
静态全局变量的作用:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。
(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
(c) 只能在本文件中使用!具有内部链接的静态;不允许在其他文件里调用;
接下来,Xcode创建一个工程,并且创建一个继承于UIView的MyView(为了验证在两个不同的 .m 文件中全局变量和静态全局变量的使用):
1 两个.m文件中同样的全局变量:
#import "MyView.h"
//声明一个全局变量
NSInteger CellHeight;
@implementation MyView
@end
----------
#import "ViewController.h"
@interface ViewController ()
@end
//声明同的全局变量
NSInteger CellHeight;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//打印变量
NSLog(@"%ld",CellHeight);
}
@end
好了,我们同时在同一个工程的两个不同 .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 文件中定义同样的静态全局变量,而互不干涉、互不影响。
文章只是粗浅分析两者的简单使用和区别,仅作参考! 至于更加底层或者其他的用法,请自行学习,另外,如本文中有错误之处,可以留言于我,望不吝赐教。谢谢!