基礎(chǔ)知識:(參考Henry725的博客)
1、函數(shù)或變量在聲明時(shí)也切,并沒有給它實(shí)際的物理內(nèi)存空間扑媚,它有時(shí)候可以保證你的程序編譯通過, 但是當(dāng)函數(shù)或變量定義的時(shí)候雷恃,它就在內(nèi)存中有了實(shí)際的物理空間钦购。
2、如果你在編譯模塊中引用的外部變量沒有在整個(gè)工程中任何一個(gè)地方定義的話褂萧, 那么即使它在編譯時(shí)可以通過押桃,在連接時(shí)也會報(bào)錯(cuò),因?yàn)槌绦蛟趦?nèi)存中找不到這個(gè)變量导犹!
3唱凯、對于一個(gè)完整的程序,內(nèi)存中的分布情況:
| 代碼區(qū) |
| 全局?jǐn)?shù)據(jù)區(qū) |
| 堆區(qū) |
| 棧區(qū) |
1.extern
extern用于變量的聲明谎痢,告訴編譯器:已經(jīng)存在一個(gè)全局變量磕昼,但是不在當(dāng)前的編譯單元內(nèi),需要連接的時(shí)候在其他編譯單元中尋找节猿。
2.static
修改變量作用域?yàn)楫?dāng)前編譯單元票从,變量生命周期不變漫雕;
避免重復(fù)定義全局變量
2.2. 修飾局部變量 -
修改變量的生命周期為整個(gè)工程周期,變量作用域不變
3.const
const修飾右邊的變量峰鄙,用來限制變量為只讀屬性浸间。
4.define
在程序的預(yù)編譯階段進(jìn)行替換處理。
5. define與const
區(qū)別:
1.define宏是在預(yù)處理階段展開吟榴。
const常量是編譯運(yùn)行階段使用魁蒜。
2.define不做檢查,不會報(bào)編譯錯(cuò)誤吩翻,只是替換兜看。const會編譯檢查,會報(bào)編譯錯(cuò)誤
3.define在展開的時(shí)候才分配內(nèi)存狭瞎,展開幾次分配幾次內(nèi)存细移。const在定義的時(shí)候會分配一次內(nèi)存到靜態(tài)區(qū),使用時(shí)不重復(fù)分配
4.define可以定義一些簡單的運(yùn)算函數(shù)
6. static和const的聯(lián)合使用
聲明一個(gè)只讀的靜態(tài)變量
7. extern和const的聯(lián)合使用
在多個(gè)文件中經(jīng)常使用的同一個(gè)全局變量熊锭。
使用場景:
1弧轧、.h文件中聲明
2、.m文件中賦值
3球涛、pch文件中導(dǎo)入頭文件即可在整個(gè)項(xiàng)目中訪問
在swift想實(shí)現(xiàn)一樣的功能非常簡單,只需要新建一個(gè)swift文件校镐,定義常量即可亿扁。
這里直接訪問即可,都不用放到.pch文件中鸟廓,因?yàn)槟J(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)前文件中訪問员咽;
8毒涧、用第7條代替define
一般常量的話,都用extern const 來代替define贝室。
因?yàn)橐坏┒x#define的方式契讲,整個(gè)工程將被重新編譯,這樣帶來的時(shí)間浪費(fèi)可想而知
當(dāng)然了很多情況還是代替不了的滑频,一般定義常量的時(shí)候是應(yīng)該使用這種方式來定義捡偏,不過也只是常量宏不被推薦,但是類函數(shù)宏用的還是很方便的峡迷,
const银伟、#define的優(yōu)缺點(diǎn)
編譯器可以對const進(jìn)行類型安全檢查。而對#define只進(jìn)行字符替換,沒有類型安全檢查彤避,并且在字符替換可能會產(chǎn)生意料不到的錯(cuò)誤傅物。
這種情況還可能出現(xiàn)以下錯(cuò)誤
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)容不可修改忠藤,兩者的作用都是使字符串只可讀不可寫挟伙。