版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.09.08 |
前言
無論是在C還是OC中,
static
、define
、const
和extern
這幾個詞有時候會用到,盡管頻次不高,使用的情況雖然不多,但是基本上也不會出錯,下面我們就詳細的說一下它們的用法、區(qū)別以及使用場景等。
static
它是靜態(tài)變量,從面向對象的角度觸發(fā),當需要一個數(shù)據(jù)對象為整類而非某個對象服務,同時又力求不破壞類的封裝性,既要求此成員隱藏在類的內(nèi)部,又要求對外不可見的時候,就可以使用static。
靜態(tài)變量的優(yōu)點:
- 節(jié)省內(nèi)存。靜態(tài)變量只存儲一處,但供所有對象使用。
- 它的值是可以更新的。
- 可提高時間效率。只要某個對象對靜態(tài)變量更新一次,所有的對象都能訪問更新后的值。
下面我們看一下示例。
#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
大家可以看到,靜態(tài)變量可以修改值,同時修改后的值在整個文件中都可以使用。
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
這個在英語里就是常數(shù)的意思,相信大家也猜得差不多了。
用它進行修飾的量只用一份內(nèi)存,適用于只有一個變量且不允許修改的情況,下面我們就看一下示例代碼。
#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
預處理指令,在編譯之前替換宏值,運行中有幾個宏就開辟幾個臨時內(nèi)存空間, 適用于傳入多個變量。
在宏定義時就是機械的替換,不會做任何語法檢查,所以如果替換后是一個表達式的話,最好加一個括號。
下面我們看一下示例。
#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
上面我定義了不帶參數(shù)的預處理命令以及帶參數(shù)的預處理命令,并給出了結果,希望對大家有所幫助吧。
參考文章
1. iOS 中extern、static修飾變量的使用及define和const區(qū)別
后記
未完,待續(xù)~~~