extern
只是用来获取全局变量的值,并不用于定义。
NSString* name = @"Tom";
@implementation ClassA
...
@end
extern NSString* name;
@implementation ClassB
NSLog(@"name=====%@",name);
...
@end
上方的例子应该比较好理解,在A中定义了一个全局变量name,在B中获取该全局变量。
接下来看一下比较容易被混淆的一种写法。
//.h文件
@interface ClassA : NSObject
extern NSString* name;
@end
//.m文件
@implementation ClassA
NSString* name = @"Tom";
@end
#import "ClassA.h"
@implementation ClassB
NSLog(@"name=====%@",name);
...
@end
很多人会认为这是在.h
文件中定义了一个全局变量,然后再.m
中赋值。因为这和定义成员变量的代码很相似。
@interface ClassA : NSObject
{
NSString* name;
}
@end
发现了吧,少了{}
了。
再回头看看第一个例子,你就会理解。这是在.m
中定义了全局变量,.h
中获取。这样所有#import "ClassA.h"
的类,就不需要自己获取了。
static
静态变量,编译期间创建。为该类的所有对象服务
修饰局部变量
存储方式:动态存储——>静态存储
生命周期:方法结束——>程序结束
作用域:方法内。
- (void)viewWillAppear:(BOOL)animated
{
static int num = 100;
NSLog(@"static=====%d",num--);
}
- (void)dealloc
{
NSLog(@"static=====销毁成功");
}
//打印结果
//即使页面销毁,变量仍旧存在
2020-02-25 17:47:07.960769+0800 xxx[8408:521354] static=====100
2020-02-25 17:47:10.258301+0800 xxx[8408:521354] static=====销毁成功
2020-02-25 17:47:12.631705+0800 xxx[8408:521354] static=====99
2020-02-25 17:47:15.099058+0800 xxx[8408:521354] static=====销毁成功
修饰全局变量
存储方式:静态存储,存储在全局(静态)区
生命周期:静态存储方式决定了其生命周期为 从程序开始运行到程序结束
作用域:从整个程序——>当前文件
NSString* name = @"Tom";
@implementation ClassA
...
@end
extern NSString* name;
@implementation ClassB
NSLog(@"name=====%@",name);
...
@end
//打印结果
2020-02-25 18:01:48.991200+0800 xxx[8529:541542] name=====Tom
#----------static修饰-----------#
static NSString* name = @"Tom";
@implementation ClassA
...
@end
extern NSString* name;
@implementation ClassB
NSLog(@"name=====%@",name);
...
@end
//编译报错
Undefined symbol: _name