一直以來對這三者的使用都不是十分的清晰,今天正好有機會整理一下,權(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";
/*******************************首頁****************************/
參考鏈接: