OC中extern、static、const和宏定義

基礎(chǔ)知識:(參考Henry725的博客)

1、函數(shù)或變量在聲明時,并沒有給它實際的物理內(nèi)存空間,它有時候可以保證你的程序編譯通過, 但是當(dāng)函數(shù)或變量定義的時候,它就在內(nèi)存中有了實際的物理空間。
2、如果你在編譯模塊中引用的外部變量沒有在整個工程中任何一個地方定義的話, 那么即使它在編譯時可以通過,在連接時也會報錯,因為程序在內(nèi)存中找不到這個變量!
3、對于一個完整的程序,內(nèi)存中的分布情況:
| 代碼區(qū) |
| 全局?jǐn)?shù)據(jù)區(qū) |
| 堆區(qū) |
| 棧區(qū) |

1.extern

extern用于變量的聲明,告訴編譯器:已經(jīng)存在一個全局變量,但是不在當(dāng)前的編譯單元內(nèi),需要連接的時候在其他編譯單元中尋找。

2.static

修改變量作用域為當(dāng)前編譯單元,變量生命周期不變;
避免重復(fù)定義全局變量
2.2. 修飾局部變量 -
修改變量的生命周期為整個工程周期,變量作用域不變

3.const

const修飾右邊的變量,用來限制變量為只讀屬性。

4.define

在程序的預(yù)編譯階段進(jìn)行替換處理。

5. define與const

區(qū)別:
1.define宏是在預(yù)處理階段展開。
const常量是編譯運行階段使用。
2.define不做檢查,不會報編譯錯誤,只是替換。const會編譯檢查,會報編譯錯誤
3.define在展開的時候才分配內(nèi)存,展開幾次分配幾次內(nèi)存。const在定義的時候會分配一次內(nèi)存到靜態(tài)區(qū),使用時不重復(fù)分配
4.define可以定義一些簡單的運算函數(shù)

6. static和const的聯(lián)合使用

聲明一個只讀的靜態(tài)變量

7. extern和const的聯(lián)合使用

在多個文件中經(jīng)常使用的同一個全局變量。
使用場景:
1、.h文件中聲明


Snip20170724_15.png

2、.m文件中賦值


Snip20170724_16.png

3、pch文件中導(dǎo)入頭文件即可在整個項目中訪問
在swift想實現(xiàn)一樣的功能非常簡單,只需要新建一個swift文件,定義常量即可。
Snip20170725_21.png

這里直接訪問即可,都不用放到.pch文件中,因為默認(rèn)權(quán)限是internal
public : 最大權(quán)限,可以在當(dāng)前framework和其他framwork中訪問;
internal : 默認(rèn)權(quán)限,可以在當(dāng)前framework中隨意訪問;
private : 私有權(quán)限,只能在當(dāng)前文件中訪問;


Snip20170725_22.png
8、用第7條代替define

一般常量的話,都用extern const 來代替define。
因為一旦定義#define的方式,整個工程將被重新編譯,這樣帶來的時間浪費可想而知
當(dāng)然了很多情況還是代替不了的,一般定義常量的時候是應(yīng)該使用這種方式來定義,不過也只是常量宏不被推薦,但是類函數(shù)宏用的還是很方便的,
const、#define的優(yōu)缺點
編譯器可以對const進(jìn)行類型安全檢查。而對#define只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤。

這種情況還可能出現(xiàn)以下錯誤
Sending 'const NSString *__strong' to parameter of type 'NSString *' discards qualifiers
原因是需要NSString* 的地方使用了const NSString*

解決辦法就是

.h中 extern const NSString* 替換為extern NSString* const
.m中const NSString* 替換為 NSString* const
解釋:前者相當(dāng)于指針本身不可修改,后者表示指針指向的內(nèi)容不可修改,兩者的作用都是使字符串只可讀不可寫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • static 修飾局部變量 讓局部變量只初始化一次 局部變量在程序中只有一份內(nèi)存 并不會改變局部變量的作用域,僅僅...
    大沖哥閱讀 1,504評論 0 1
  • 在項目中,我們經(jīng)常全局用到一些常量,那么這些常量在項目中怎么管理呢?看完這篇文章相信,讀者應(yīng)該不在迷惑了。 文章展...
    7dfa9c18c1d1閱讀 906評論 5 2
  • ### const,static,extern簡介 ### 一、const與宏的區(qū)別(面試題): * `const...
    老騷鵝閱讀 720評論 0 7
  • 如果沒有水我們的世界也會死亡,如果沒有水花花草草,一樹一木都會干死,如果沒有水我們也會渴死,小魚和海洋動物也會死去...
    月亮寶寶_太陽媽媽閱讀 214評論 0 0
  • 為她,有人寫詩,有人寫書;為她,有人彈琴,有人唱歌;為她,有人翻山越嶺,有人漂洋過海;為她,有人牽腸掛肚,有人愁腸...
    小花一朵朵閱讀 702評論 0 4

友情鏈接更多精彩內(nèi)容