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

Objective-C实现全局变量

96 
一线码农 
2015.05.17 19:28* 字数 179 阅读 874评论 0

在苹果公司新推出的swift编程语言中我们可以很方便的在项目中创建一个.swift文件,便可以在其中声明项目中要使用的全局变量了,但是回到Objective-C使用全局变量就要相对麻烦一些

首先,需要创建一个类GlobleVar,在GlobleVar.h文件中声明两个类方法

+(void)strSetter:(NSString *) str;

+(NSString *) strGetter;

然后再GlobleVar.m的@implementation中创建一个静态变量

static NSString* strs;

+(void)strSetter:(NSString *)str {

if (str != nil) {

strs = str;

}

}

+(NSString *) strGetter{

return strs;

}

使用[GlobleVar strSetter:@"test"];就可以对全局变量进行修改,使用[GlobleVar strGetter];就可以获取全局变量的值。

 

 

写在前面:花了近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 文件中声明了一模一样的全局变量,这样会发生什么情况呢?程序编译报错!!!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

这里写图片描述 
我的理解是:同一个工程中,两个不同 .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 文件中定义同样的静态全局变量,而互不干涉、互不影响。

posted on 2018-03-07 19:38  oyl  阅读(746)  评论(0)    收藏  举报

导航