由于之前沒有使用過簡書,所以沒有使用markdown書寫 , 如果看著不方便,我之后又重新整理一份,看起來會整潔一點 . iOS-詳細解讀const - 簡書?
在過去開發中,幾乎每一個人都會定義宏,因為這東西實在是好用,省去了代碼量而且還不容易錯,而我這篇文中所介紹的const可以完美替帶宏定義.
并且蘋果也建議大家拋棄宏定義而轉投const ,并且swift里壓根就沒有宏定義這么一說,所以為了方便我們以后的開發,還是盡早棄暗投明的好 .
進入正題我們先來說說,
- 1. const與宏的區別:
**(1)執行時刻:宏是預編譯(編譯之前處理),const是編譯階段。
(2)編譯檢查:宏不做檢查,不會報編譯錯誤,只是替換,const會編譯檢查,會報編譯錯誤。
(3)宏可以定義一些函數,方法。 const不能。
(這里需要證實一點,宏不會開辟新的內存空間 ,而是存放在常量區,也就是正常使用并不會造成內存暴漲 ).**
- 2.const作用:限制類型
- (1)const僅僅用來修飾右邊的變量(可以是基本數據變量p,也可以是指針變量*p)
- (2).被const修飾的變量是只讀的。
- 3.const的具體用法
只要記住一句話const只修飾右邊最近的基本變量
-? 示例: const:修飾基本變量p , 這里有兩種寫法并且意義相同
` const int b =20;`
`int const b =20;`
這里b是只讀變量不允許修改值 .
-? 需要注意下面兩句的區
const修飾指針常量
`int const *p1;? 則 *p1:常量(不可變)? ? p1:變量(可變)`
const修飾指針變量
`? int *const p;? 則*p1:變量? p1:常量(不可變)`
從上面看來,const的定義區間就一目了然了 ,只要看它后面跟的是否為指針,是則指針的指向就是不可改變的, 如果后面是變量則變量的值不可修改.
- 4.static與const聯合使用
- static與const作用:
(1)聲明一個只讀的靜態變量
那么為什么要改變全局變量作用域,主要是為了防止重復聲明全局變量。 在開發中聲明的全局變量,有些不希望外界改動,只允許讀取。這時就需要兩者一起使用.
(2) 聲明一個靜態的全局只讀常量比如一個基本數據類型不希望別人改動則可使用? `static const int a = 10;`
(3)也可以用來代替宏,把一個經常使用的字符串常量,定義成靜態全局只讀變量.
(4)開發中經常拿到key修改值,因此用const修飾key,表示key只讀,不允許修改。
`static? NSString * const key = @"name";`
`static? NSString const *key1 = @"name";`
現在應該也可以分清這兩句的區別了吧!
- 5.**extern與const聯合使用**? VS? **static與const聯合使用**
- (1) static與const組合:只能在本文件中使用,如果多個文件同時使用,需要在每個文件都需要定義一份靜態全局變量。
- (2) extern與const組合:在多個文件中經常使用的同一個字符串常量,可以使用extern與const組合。如果你需要一個全局變量就可以選擇
`extern? NSString * const key = @"name";`
`extern? NSString const *key1 = @"name";`
雖然這種做法很方便,但是如果多人開發可能會出現大家定義沖突,所以建議
通常搞一個文件,里面專門定義全局變量,統一管理,就可以避免定義沖突的情況了 .