標籤:
原文網址:http://www.jianshu.com/p/f83335e036b5
在iOS開發中,經常用到宏定義,或用const修飾一些資料類型,經常有開發人員不知怎麼正確使用,導致項目中亂用宏與const修飾
你能區分下面的嗎?知道什麼時候用嗎?
#define HSCoder @"漢斯哈哈哈"NSString *HSCoder = @"漢斯哈哈哈";extern NSString *HSCoder;extern const NSString *HSCoder;static const NSString *HSCoder = @"漢斯哈哈哈";const NSString *HSCoder = @"漢斯哈哈哈";NSString const *HSCoder = @"漢斯哈哈哈";NSString * const HSCoder = @"漢斯哈哈哈";
當我們想全域共用一些資料時,可以用宏、變數、常量
宏:
#define HSCoder @"漢斯哈哈哈"
變數:
NSString *HSCoder = @"漢斯哈哈哈";
常量:
四種寫法:static const NSString *HSCoder = @"漢斯哈哈哈";const NSString *HSCoder = @"漢斯哈哈哈";NSString const *HSCoder = @"漢斯哈哈哈";NSString * const HSCoder = @"漢斯哈哈哈";
思考:宏與常/變數的選擇?
- 宏:只是在前置處理器裡進行文本替換,沒有類型,不做任何類型檢查,編譯器可以對相同的字串進行最佳化。只儲存一份到 .rodata 段。甚至有相同尾碼的字串也可以最佳化,你可以用GCC 編譯測試,"Hello world" 與 "world" 兩個字串,只儲存前面一個。取的時候只需要給前面和中間的地址,如果是整形、浮點型會有多份拷貝,但這些數寫在指令中。占的只是程式碼片段而已,大量用宏會導致二進位檔案變大
- 變數:共用一塊記憶體空間,就算項目中N處用到,也不會分配N塊記憶體空間,可以被修改,在編譯階段會執行類型檢查
- 常量:共用一塊記憶體空間,就算項目中N處用到,也不會分配N塊記憶體空間,可以根據const修飾的位置設定能否修改,在編譯階段會執行類型檢查
盡量使用const,看蘋果api使用常量多點,如:
這裡寫圖片描述常量區分
全域常量:不管你定義在任何檔案夾,外部都能訪問
const NSString *HSCoder = @"漢斯哈哈哈";
例如:
在ViewController定義一個 HSCoder 字串全域常量:
這裡寫圖片描述
在AppDelegate中訪問:
這裡寫圖片描述
局部常量:用static修飾後,不能提供外界訪問
static const NSString *HSCoder = @"漢斯哈哈哈";
例如:
在ViewController定義一個 HSCoder 字串局部常量:
這裡寫圖片描述
編譯時間報錯:
這裡寫圖片描述const修飾位置不同,代表什嗎?
1.const NSString *HSCoder = @"漢斯哈哈哈";2.NSString const *HSCoder = @"漢斯哈哈哈";3.NSString * const HSCoder = @"漢斯哈哈哈";
1.const NSString *HSCoder = @"漢斯哈哈哈";"*HSCoder"不能被修改, "HSCoder"能被修改2.NSString const *HSCoder = @"漢斯哈哈哈";"*HSCoder"不能被修改, "HSCoder"能被修改3.NSString * const HSCoder = @"漢斯哈哈哈";"HSCoder"不能被修改,"*HSCoder"能被修改注意:1和2其實沒什麼區別
結論:const右邊的總不能被修改
驗證:
const int *p;
這裡寫圖片描述
int const *p;
這裡寫圖片描述
int * const p;
這裡寫圖片描述
所以一般我們定義一個常量又不想被修改應該這樣:
NSString * const HSCoder = @"漢斯哈哈哈";
測試:
在ViewController定義一個常量HSCoder:
這裡寫圖片描述
在AppDelegate修改常量HSCoder,看下面報錯提示:
這裡寫圖片描述
一般項目中,定義全域常量,會寫在獨立檔案裡
HSConst.m 定義常量:
這裡寫圖片描述
HSConst.h 提供外接訪問常量:
這裡寫圖片描述
在AppDelegate中訪問:
這裡寫圖片描述
文/漢斯哈哈哈(簡書作者)
原文連結:http://www.jianshu.com/p/f83335e036b5
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
【轉】iOS 宏(define)與常量(const)的正確使用-- 不錯