基礎(chǔ)知識:(參考Henry725的博客)
1、函數(shù)或變量在聲明時,并沒有給它實際的物理內(nèi)存空間,它有時候可以保證你的程序編譯通過, 但是當(dāng)函數(shù)或變量定義的時候,它就在內(nèi)存中有了實際的物理空間。
2、如果你在編譯模塊中引用的外部變量沒有在整個工程中任何一個地方定義的話, 那么即使它在編譯時可以通過,在連接時也會報錯,因為程序在內(nèi)存中找不到這個變量!
3、對于一個完整的程序,內(nèi)存中的分布情況:
| 代碼區(qū) |
| 全局?jǐn)?shù)據(jù)區(qū) |
| 堆區(qū) |
| 棧區(qū) |
1.extern
extern用于變量的聲明,告訴編譯器:已經(jīng)存在一個全局變量,但是不在當(dāng)前的編譯單元內(nèi),需要連接的時候在其他編譯單元中尋找。
2.static
修改變量作用域為當(dāng)前編譯單元,變量生命周期不變;
避免重復(fù)定義全局變量
2.2. 修飾局部變量 -
修改變量的生命周期為整個工程周期,變量作用域不變
3.const
const修飾右邊的變量,用來限制變量為只讀屬性。
4.define
在程序的預(yù)編譯階段進(jìn)行替換處理。
5. define與const
區(qū)別:
1.define宏是在預(yù)處理階段展開。
const常量是編譯運行階段使用。
2.define不做檢查,不會報編譯錯誤,只是替換。const會編譯檢查,會報編譯錯誤
3.define在展開的時候才分配內(nèi)存,展開幾次分配幾次內(nèi)存。const在定義的時候會分配一次內(nèi)存到靜態(tài)區(qū),使用時不重復(fù)分配
4.define可以定義一些簡單的運算函數(shù)
6. static和const的聯(lián)合使用
聲明一個只讀的靜態(tài)變量
7. extern和const的聯(lián)合使用
在多個文件中經(jīng)常使用的同一個全局變量。
使用場景:
1、.h文件中聲明

2、.m文件中賦值

3、pch文件中導(dǎo)入頭文件即可在整個項目中訪問
在swift想實現(xiàn)一樣的功能非常簡單,只需要新建一個swift文件,定義常量即可。

這里直接訪問即可,都不用放到.pch文件中,因為默認(rèn)權(quán)限是internal
public : 最大權(quán)限,可以在當(dāng)前framework和其他framwork中訪問;
internal : 默認(rèn)權(quán)限,可以在當(dāng)前framework中隨意訪問;
private : 私有權(quán)限,只能在當(dāng)前文件中訪問;

8、用第7條代替define
一般常量的話,都用extern const 來代替define。
因為一旦定義#define的方式,整個工程將被重新編譯,這樣帶來的時間浪費可想而知
當(dāng)然了很多情況還是代替不了的,一般定義常量的時候是應(yīng)該使用這種方式來定義,不過也只是常量宏不被推薦,但是類函數(shù)宏用的還是很方便的,
const、#define的優(yōu)缺點
編譯器可以對const進(jìn)行類型安全檢查。而對#define只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤。
這種情況還可能出現(xiàn)以下錯誤
Sending 'const NSString *__strong' to parameter of type 'NSString *' discards qualifiers
原因是需要NSString* 的地方使用了const NSString*
解決辦法就是
.h中 extern const NSString* 替換為extern NSString* const
.m中const NSString* 替換為 NSString* const
解釋:前者相當(dāng)于指針本身不可修改,后者表示指針指向的內(nèi)容不可修改,兩者的作用都是使字符串只可讀不可寫。