论iOS中的全局变量和static全局变量的定义和区别

写在前面:花了近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 文件中定义同样的静态全局变量,而互不干涉、互不影响。


文章只是粗浅分析两者的简单使用和区别,仅作参考! 至于更加底层或者其他的用法,请自行学习,另外,如本文中有错误之处,可以留言于我,望不吝赐教。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值