OC 中的 static extern

2020-03-05  本文已影响0人  不是假发是桂

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
上一篇 下一篇

猜你喜欢

热点阅读