static、define、const和extern的區(qū)別和使用場景

版本記錄

版本號 時間
V1.0 2017.09.08

前言

無論是在C還是OC中,staticdefineconstextern這幾個詞有時候會用到,盡管頻次不高,使用的情況雖然不多,但是基本上也不會出錯,下面我們就詳細的說一下它們的用法、區(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ù)~~~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容