版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.09.08 |
前言
无论是在C还是OC中,
static
、define
、const
和extern
这几个词有时候会用到,尽管频次不高,使用的情况虽然不多,但是基本上也不会出错,下面我们就详细的说一下它们的用法、区别以及使用场景等。
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区别
后记
未完,待续~~~
网友评论