对于extern来说是这样的是从一个类扩展到另一个类中的,例如在ViewController中声明一个变量NSString * meString,然后赋值 meString = @"100", 然后在另外一个类NextViewController中用extern修饰一个变量extern NSString *meString;
meString和extern的声明在这两个地方都可以
@implementation ViewController
extern NSString *meString
NSString * meString;和
NSString * meString;
extern NSString *meString
@interface ViewController ()
然后在NextViewController中输出一下meString,当然你也可以对meString重新进行赋值,就是说meString虽然定义在ViewController中但好像是公共的,也称为全局变量吧
输出而对于static声明的变量,只是本类的内部的变量,static声明的地方和extern一样,
1.修饰局部变量,保证局部变量永远只初始化一次,在程序的运行过程中永远只有一份内存, 生命周期类似全局变量了,但是作用域不变.
2.修饰全局变量
使全局变量的作用域仅限于当前文件内部,即当前文件内部才能访问该全局变量。
iOS中在一个文件声明的全局变量,工程的其他文件也是能访问的,但是我又不想让其他文件访问,这时就可以用static修饰它了,比较典型的是使用GCD一次性函数创建的单例,全局变量基本上都会用static修饰.
下面是一个GCD一次函数创建的单利
@implementation LoginTool
//static修饰全局变量,让外界文件无法访问
static LoginTool *_sharedManager = nil;
+ (LoginTool *)sharedManager {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedManager = [[self alloc] init];
});
return _sharedManager;
}
3.修饰函数
static修饰函数时,被修饰的函数被称为静态函数,使得外部文件无法访问这个函数,仅本文件可以访问
区别:
(1)extern修饰的全局变量默认是有外部链接的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过external全局变量的声明,就可以使用全局变量。
(2)static修饰的全局静态变量,作用域是声明此变量所在的文件。
网友评论