iOS 宏(define)與常量(const)的正確使用

來源:互聯網
上載者:User

標籤:

iOS 宏(define)與常量(const)的正確使用

在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中訪問:

 

1.宏會分配記憶體空間?不是先行編譯的時候直接替換嗎?如果分配記憶體空間,那就意味著是C++中的左值了,宏肯定不是左值吧
2.static的作用是限定其可見範圍只在本檔案內,當然要理解成是否是全域,也許沒問題。假如在標頭檔中定義一個static const 變數,那隻要include了這個標頭檔,就都可以使用,只不過不再是同一個變數了

個人見解~如有錯誤歡迎討論~

喜歡(0)回複

WOWBingo: @yangguang1029 我也不明白,你可以看一下這裡http://blog.csdn.net/love_gaohz/article/details/7567856
這裡說宏每次替換的時候分配一次記憶體,好像是const效率高些

回複2015.08.11 11:52

漢斯哈哈哈: @yangguang1029 謝謝指點!宏只是在前置處理器裡進行文本替換,跟分配記憶體無關係

回複2015.08.11 13:20

漢斯哈哈哈: @WOWBingo 就我目前理解,const效率有可能會高點,如果宏定義整形,浮點型,會有多份拷貝,多個拷貝不是說占更多記憶體,這些數寫在指令中

回複2015.08.11 13:22

漢斯哈哈哈: 占的只是程式碼片段而已,大量用宏會導致二進位檔案變大

回複2015.08.11 14:00

Teehom: 宏只是簡單的替換,如果你用了宏,每次的字串都要重新建立地址,浪費記憶體

回複 

WOWBingo

3 樓 · 2015.08.11 11:55

請問既然不鼓勵使用宏,為什麼最後要用UIKIT_EXTERN呢

喜歡(0)回複

漢斯哈哈哈: @WOWBingo 不鼓勵也並不是不能用 

回複2015.08.11 13:25

WOWBingo: @漢斯哈哈哈 回答的機智 

回複2015.08.11 14:44

公爵海恩庭斯: @WOWBingo 並不是不鼓勵使用宏,而是不鼓勵使用宏來定義常量。因為使用宏來定義常量容易帶來一些不必要的麻煩,比如運算的時候。

回複2015.08.25 16:12

公爵海恩庭斯: @WOWBingo 引用一句話:“Constants should be declared as `static` constants and not `#define`s unless explicitly being used as a macro.”。參考https://github.com/objc-zen/objc-zen-book

回複2015.08.25 16:15

WOWBingo: @公爵海恩庭斯 學習了

回複 轉自:http://www.jianshu.com/p/f83335e036b5

iOS 宏(define)與常量(const)的正確使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.