Const,Static,Extern的使用

一直以來對這三者的使用都不是十分的清晰,今天正好有機會整理一下,權(quán)當留著以后當筆記用

Const

const有兩個作用:

1.const僅僅用來修飾右邊的變量
2.被const修飾的變量只讀,也就是只能獲取,不能修改。

- (void)viewDidLoad {
    [super viewDidLoad];

    // 這兩種寫法是一樣的,const只修飾右邊的基本變量b
    const int b = 20; // b:只讀變量
    int const b = 20; // b:只讀變量

    // 不允許修改值
    b = 1;

##指向常量的指針;常用于銀行報表,具有只讀不可寫的權(quán)限;
    // const修飾指針變量 兩種方式一樣
    const int *p1; // *p1:常量 p1:變量
    int const *p1; // *p1:常量 p1:變量

##指向變量的常量指針;可以改變數(shù)據(jù),但是不可以改變地址;
    // const修飾指針變量p1
    int * const p1; // *p1:變量 p1:常量


##指向常量的常量指針;數(shù)據(jù)和地址都是不可以改變的;
    // 第一個const修飾*p1 第二個const修飾 p1
    // 兩種方式一樣
    const int * const p1; // *p1:常量 p1:常量

    int const * const p1;  // *p1:常量 p1:常量
    }

const的使用場景:

1.修飾全局只讀變量,常用來代替宏

2.修飾方法中的參數(shù)

在開發(fā)中我們會將經(jīng)常使用的常量用宏來保存,比如:

#define STWName @"STWName"
- (void)viewDidLoad {
    [super viewDidLoad];
    [XMGUserDefault setValue:@"gzp" forKey:STWName];
}

但是蘋果其實是不推薦我們使用宏的,它更喜歡我們使用const,所以在swift中宏已經(jīng)被拋棄了,我們只能使用const來代替宏

// 字符串常量
static NSString * const STWName = @"STWName";
- (void)viewDidLoad {
    [super viewDidLoad];
    [XMGUserDefault setValue:@"gzp" forKey:STWName];
}

const和宏的一些使用區(qū)別:

編譯時刻:宏是預(yù)編譯(編譯之前處理),const是編譯階段。
編譯檢查:宏不做檢查,不會報編譯錯誤,只是替換,const會編譯檢查,會報編譯錯誤。
宏的好處:宏能定義一些函數(shù),方法。 const不能。
宏的壞處:使用大量宏,容易造成預(yù)編譯時間過長

Static 和 Extern

static作用:

修飾局部變量:被static修飾的局部變量,可以延長生命周期,生命周期跟整個應(yīng)用程序一致;被static修飾的局部變量,只會分配一次內(nèi)存。

修飾全局變量:被static修飾的全局變量,作用域會被修改,只能在當前文件下使用;

extern作用: 用來聲明外部全局變量;只能用于生明,不能用于定義變量;

extern工作原理:先會去當前文件下查找有沒有對應(yīng)全局變量,如果沒有,才會去其他文件查找。

static與const聯(lián)合使用

static,const結(jié)合使用的作用:聲明一個只讀的全局靜態(tài)變量。

開發(fā)使用場景:在一個文件中經(jīng)常使用的字符串常量,可以使用static與const組合

static NSString * const SWTName = @"SWTName";

[[NSUserDefaults standardUserDefaults] setObject:@"張三" forKey:SWTName];

extern與const聯(lián)合使用

開發(fā)中使用場景:在多個文件中經(jīng)常使用的同一個字符串常量,可以使用extern與const組合.
為了避免重復(fù)報錯,全局變量不能定義在自己的類中,我們需要自己創(chuàng)建一個全局文件用來統(tǒng)一管理全局的東西,創(chuàng)建一個全局類GlobelConst:

GlobeConst.h

/*******************************首頁****************************/

extern NSString * const nameKey;

/*******************************首頁****************************/

GlobeConst.m

#import <Foundation/Foundation.h>

/*******************************首頁****************************/

NSString * const nameKey = @"name";


/*******************************首頁****************************/

參考鏈接:

如何正確使用const,static,extern】|那些人追的干貨

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

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