我們在看一些大牛的第三方時,里面會出現很多const、static和extern,尤其是const和static,const和extern的結合使用,直接令很多小伙伴懵逼了,今天就詳細講解一下這三個關鍵字的正確使用方式。
一、const
const的作用和宏是很類似的,其實,蘋果是不推薦我們使用宏的,它更喜歡我們使用const,於是乎,在swift中宏就被拋棄了,我們只能使用const。
在這里簡單聊一下const和宏的區別:
1.編譯時刻 宏:預編譯 const:編譯
2.編譯檢查 宏沒有編譯檢查,不會報編譯錯誤,只是替換;const有編譯檢查,會報編譯錯誤
3.宏的好處 宏能定義一些函數,方法,但是const不可以
4.宏的壞處 大量使用宏,會導致預編譯時間過長。
const有兩個作用:
1.修飾右邊的基本變量和指針變量;
2.被const修飾的變量只讀,也就是只能獲取,不能修改。
const的使用場景:
1.修飾全局變量 ==>全局只讀變量 ==> 代替宏
2.修飾方法中的參數
代碼如下:
NSString * const gender = @"gender";
[[NSUserDefaults standardUserDefaults] objectForKey:gender];
二、static
static有兩個作用:
1.修飾局部變量:被static修飾的局部變量,可以延長生命周期,生命周期跟整個應用程序一致;被static修飾的局部變量,只會分配一次內存。
代碼如下:
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event {
static int i = 0;
i++;
NSLog(@"%d", i);
}
2.修飾全局變量:被static修飾的全局變量,作用域會修改,生命周期不會改,只能在當前文件下使用。
代碼如下:
static int m = 0;
三、extern
extern作用:聲明外部全局變量。
extern工作原理:先會去當前文件下查找有沒有對應全局變量,如果沒有,才會去其他文件查找。
四、static和const的結合使用
static,const結合使用的作用:聲明一個只讀的全局靜態變量。
開發使用場景:在一個文件中經常使用的字符串常量,可以使用static與const組合。
代碼如下:
static NSString * const name = @"name";
[[NSUserDefaults standardUserDefaults] setObject:@"123" forKey:name];
五、extern和const的結合使用
使用場景:在多個文件中經常使用的同一個字符串常量,可以使用extern與const組合。
開發時有個規定,為了避免重復報錯,全局變量不能定義在自己的類中,我們需要自己創建一個全局文件管理全局東西。
創建一個全局類GlobelConst。
代碼如下:
#import<Foundation/Foundation.h>
extern NSString * const discover_name;
extern NSString * const home_name;
#import "GlobelConst.h"
//定義整個項目中的全局變量
/********** 發現模塊 **********/
NSString * const discover_name = @"name";
/********** 首頁模塊 **********/
NSString * const home_name = @"name";
[[NSUserDefaults standardUserDefaults] setObject:@"123" forKey:discover_name];
[[NSUserDefaults standardUserDefaults] objectForKey:discover_name];