OC技术

static、define、const和extern的区别和使用

2017-09-08  本文已影响41人  刀客传奇

版本记录

版本号 时间
V1.0 2017.09.08

前言

无论是在C还是OC中,staticdefineconstextern这几个词有时候会用到,尽管频次不高,使用的情况虽然不多,但是基本上也不会出错,下面我们就详细的说一下它们的用法、区别以及使用场景等。

static

它是静态变量,从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时又力求不破坏类的封装性,既要求此成员隐藏在类的内部,又要求对外不可见的时候,就可以使用static。

静态变量的优点:

下面我们看一下示例。

#import "JJKeyWordsVC.h"

@interface JJKeyWordsVC ()

@end

@implementation JJKeyWordsVC

static NSInteger number = 10;

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    NSLog(@"number1 = %ld", number);
    
    number ++;
    
    NSLog(@"number2 = %ld", number);
}

@end

下面看输出结果

2017-09-08 16:20:02.447 JJOC[1849:46368] number1 = 10
2017-09-08 16:20:02.447 JJOC[1849:46368] number2 = 11

大家可以看到,静态变量可以修改值,同时修改后的值在整个文件中都可以使用。


extern

它是一个外部变量,一般用于引用其他类的全局变量。

下面我们看一下简单的例子。

1. JJKeyWordsVC.h
#import <UIKit/UIKit.h>

@interface JJKeyWordsVC : UIViewController

@end
2. JJKeyWordsVC.m
#import "JJKeyWordsVC.h"
#import "JJExternVC.h"

@interface JJKeyWordsVC ()

@end

@implementation JJKeyWordsVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    NSLog(@"%@", AFNetworkingReachabilityDidChangeNotification);
}

@end
3. JJExternVC.h
#import <UIKit/UIKit.h>

extern NSString *const AFNetworkingReachabilityDidChangeNotification;

@interface JJExternVC : UIViewController

@end
4. JJExternVC.m
#import "JJExternVC.h"

NSString *const AFNetworkingReachabilityDidChangeNotification = @"com.alamofire.networking.reachability.change";

@interface JJExternVC ()


@end

@implementation JJExternVC


- (void)viewDidLoad
{
    [super viewDidLoad];
}

@end

下面看输出结果

2017-09-08 16:33:59.470 JJOC[2227:61234] com.alamofire.networking.reachability.change

const

这个在英语里就是常数的意思,相信大家也猜得差不多了。

用它进行修饰的量只用一份内存,适用于只有一个变量且不允许修改的情况,下面我们就看一下示例代码。

#import "JJConstVC.h"

@interface JJConstVC ()

@end

const NSInteger number = 100;

@implementation JJConstVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    number ++;
    NSLog(@"number = %ld", number);
}

@end

这种情况是错误的,连编译都过不去,会提示Cannot assign to variable 'number' with const-qualified type 'const NSInteger'(aka 'const long')

上面的意思就是我定义了NSInteger类型的常量,不能更改其值。


define

预处理指令,在编译之前替换宏值,运行中有几个宏就开辟几个临时内存空间, 适用于传入多个变量。

在宏定义时就是机械的替换,不会做任何语法检查,所以如果替换后是一个表达式的话,最好加一个括号。

下面我们看一下示例。

#import "JJdefineVC.h"

#define JJColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define JJValue (200 + 15)

@interface JJdefineVC ()

@end

@implementation JJdefineVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = JJColor(180, 100, 100);
    
    NSInteger value = JJValue * 10;
    
    NSLog(@"value = %ld", value);
    
#ifdef DEBUG
    NSLog(@"DEBUG");
#else
    NSLog(@"Release");
#endif

}

@end

下面看输出结果和页面颜色效果图。

2017-09-08 17:13:19.955 JJOC[3368:86549] value = 2150
2017-09-08 17:13:19.955 JJOC[3368:86549] DEBUG

上面我定义了不带参数的预处理命令以及带参数的预处理命令,并给出了结果,希望对大家有所帮助吧。

参考文章

1. iOS 中extern、static修饰变量的使用及define和const区别

后记

未完,待续~~~

上一篇 下一篇

猜你喜欢

热点阅读