由于之前沒有使用過簡書,所以沒有使用markdown書寫 , 如果看著不方便,我之后又重新整理一份,看起來會整潔一點 . iOS-詳細解讀const - 簡書?
在過去開發(fā)中,幾乎每一個人都會定義宏,因為這東西實在是好用,省去了代碼量而且還不容易錯,而我這篇文中所介紹的const可以完美替帶宏定義.
并且蘋果也建議大家拋棄宏定義而轉(zhuǎn)投const ,并且swift里壓根就沒有宏定義這么一說,所以為了方便我們以后的開發(fā),還是盡早棄暗投明的好 .
進入正題我們先來說說,
- 1. const與宏的區(qū)別:
**(1)執(zhí)行時刻:宏是預(yù)編譯(編譯之前處理)拾稳,const是編譯階段散庶。
(2)編譯檢查:宏不做檢查,不會報編譯錯誤姓言,只是替換寻狂,const會編譯檢查岁经,會報編譯錯誤。
(3)宏可以定義一些函數(shù)蛇券,方法缀壤。 const不能。
(這里需要證實一點,宏不會開辟新的內(nèi)存空間 ,而是存放在常量區(qū),也就是正常使用并不會造成內(nèi)存暴漲 ).**
- 2.const作用:限制類型
- (1)const僅僅用來修飾右邊的變量(可以是基本數(shù)據(jù)變量p,也可以是指針變量*p)
- (2).被const修飾的變量是只讀的纠亚。
- 3.const的具體用法
只要記住一句話const只修飾右邊最近的基本變量
-? 示例: const:修飾基本變量p , 這里有兩種寫法并且意義相同
` const int b =20;`
`int const b =20;`
這里b是只讀變量不允許修改值 .
-? 需要注意下面兩句的區(qū)
const修飾指針常量
`int const *p1;? 則 *p1:常量(不可變)? ? p1:變量(可變)`
const修飾指針變量
`? int *const p;? 則*p1:變量? p1:常量(不可變)`
從上面看來,const的定義區(qū)間就一目了然了 ,只要看它后面跟的是否為指針,是則指針的指向就是不可改變的, 如果后面是變量則變量的值不可修改.
- 4.static與const聯(lián)合使用
- static與const作用:
(1)聲明一個只讀的靜態(tài)變量
那么為什么要改變?nèi)肿兞孔饔糜蛱聊剑饕菫榱朔乐怪貜?fù)聲明全局變量。 在開發(fā)中聲明的全局變量菜枷,有些不希望外界改動苍糠,只允許讀取。這時就需要兩者一起使用.
(2) 聲明一個靜態(tài)的全局只讀常量比如一個基本數(shù)據(jù)類型不希望別人改動則可使用? `static const int a = 10;`
(3)也可以用來代替宏啤誊,把一個經(jīng)常使用的字符串常量岳瞭,定義成靜態(tài)全局只讀變量.
(4)開發(fā)中經(jīng)常拿到key修改值,因此用const修飾key,表示key只讀蚊锹,不允許修改瞳筏。
`static? NSString * const key = @"name";`
`static? NSString const *key1 = @"name";`
現(xiàn)在應(yīng)該也可以分清這兩句的區(qū)別了吧!
- 5.**extern與const聯(lián)合使用**? VS? **static與const聯(lián)合使用**
- (1) static與const組合:只能在本文件中使用,如果多個文件同時使用,需要在每個文件都需要定義一份靜態(tài)全局變量。
- (2) extern與const組合:在多個文件中經(jīng)常使用的同一個字符串常量牡昆,可以使用extern與const組合姚炕。如果你需要一個全局變量就可以選擇
`extern? NSString * const key = @"name";`
`extern? NSString const *key1 = @"name";`
雖然這種做法很方便,但是如果多人開發(fā)可能會出現(xiàn)大家定義沖突,所以建議
通常搞一個文件,里面專門定義全局變量摊欠,統(tǒng)一管理,就可以避免定義沖突的情況了 .