1. 什麼是const ?
const是C/C++中的一個關鍵字(修飾符), const一般用來定義一個常量, 既然叫做常量, 即以後再也不能修改其值.
const定義常量
2. 什麼是#define?
而define, 宏定義, 則是一條預編譯指令, 編譯器在編譯階段會將所有使用到宏的地方簡單地進行替換. 如下圖所示 :
宏定義的替換
3. 他們有什麼用?
const 和 define 都能定義一個常量, 都能實現修改值修改一次, 則所有用上該常量的地方都同步改值, 一句代碼都不用改.
使代碼更易維護
提高代碼的效率
4. 他們有什麼區別?
相同點
都能定義常量
不同點
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若干個拷貝
const和define區別
編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率比宏定義要高
既然宏定義能做的事const都能做, 那宏還有什麼存在的必要麼?
存在即合理, 既然宏定義還沒被淘汰, 那必然有它存在的道理.
宏能做到const不能辦到的事.
宏能定義函數
OC的單例模式用到宏
宏還能根據傳入的參數生成字符串, 如下
宏定義高級功能
kStringCat(x, y) // 根據傳入的x和y拼接成字符串
kToString(x) // 根據傳入的x生成一個字符串
5. 應該怎麼用?
const有條原則, 那就是他右邊是什麼, 什麼就不可變, 如下
const不可變原則
用const修飾函數的形參, 則能提高代碼的安全性, 同時減少程序員之間的溝通成本
函數內部只能用x和y, 不能改
宏多用於條件編譯, 如需要對於不同的情況執行不同的代碼塊, 則可以使用宏的條件編譯來進行判斷
總結
在Objective-C中, 隨處可見const常量, 所以大家應該大膽地使用const, 它會帶給你大大的益處. 同時, 只要某個數據是定義之後永遠都不需要也不能修改的, 請使用const!