PCH介紹
PCH文件,是一個預編譯文件,常用來處理頭文件引用,宏定義等。開發過程中,一般將整個工程都使用的頭文件包含在PCH文件下,編譯器就會自動的將PCH文件中的頭文件添加到所有的源文件中去,很大程度上方便了開發者。
自Xcode6以后,使用xcode創建的默認工程項目,不再包含PCH文件,對此,并沒有找到蘋果給出的官方解釋,綜合各方面因素,可能是出于以下方面考慮:
1. 降低各個模塊之間的耦合度,PCH文件的存在會增加各個模塊之間的耦合度,降低了代碼的可復用性,不便于代碼遷移。
2. 創建了PCH文件,會一定程度增加build time,出于編譯速度的考慮,棄用了PCH。
很多時候,為了解決類似:如果一個宏,很多文件都需要用到;或者一個公共的頭文件,很多模塊都需要導入這個頭文件;發布時,禁用日志輸出等問題,PCH便開發者提供了比較便捷的解決方案。PCH最常用的應用場景主要有一下三個:
很多時候,我們需要用到各種全局都需要使用的宏定義,此時,PCH就能實現一次定義,全局生效,也便于后期修改和維護,想象一下,你在1000個模塊中都使用的同一個宏定義,難道復制粘貼1000次嗎?
全局需要的頭文件的情況和全局使用的宏定義類似。
開發過程中,除了常用的斷點調試,我們還會經常使用日志輸出的形式來調試代碼。但是日志輸出非常消耗性能,一般在正式發布應用時,我們會禁用日志輸出。想象一下,發布前,要找到所有的NSLog并全部注釋或者刪除,是多浪費時間的一件事。此時,我們便可以再PCH中自定義一個日志輸出,并加上條件編譯,這個問題將迎刃而解。
打開工程項目,CMD+N彈出新建文件界面:
找到other,點擊PCH File,PCH命名一般和工程名相同,勾選Targets。
點擊完成,打開PCH文件,看到默認個的內容如下所示
此時,我們在PCH文件中定義一個全局使用的宏,
#define MAXCHATCNT 100
如果此時直接編譯,和沒創建PCH文件沒有任何不同,因為PCH文件需要設置提前編譯。
選擇工程項目,點擊build settings,選擇all,搜索“prefix header”,
雙擊prefix header,
填入PCH的路徑,然后就可以愉快的編譯了。之后試試在其他文件中使用定義的全局宏。
這兩種情況,直接參考上一節即可。不多做說明,有任何不清楚的地方,均可留言。
重點講解一下,如何合理的利用PCH,方便的解決日志輸出的煩惱。
1.首先按照之前的步驟創建PCH文件。
2.在PCH文件中自定義日志輸出
#define MyLog(...) NSLog(__VA_ARGS__)
其中“...”表示可變參數,“__VA_ARGS__”表示左邊的"..."會替換右側NSLog中的參數。
以后當需要使用NSLog的地方,全部使用MyLog替代。
因為是調試階段才讓日志輸出有效,因此,PCH中使用條件編譯。
#ifdef DEBUG
#define MyLog(...) NSLog(__VA_ARGS__)
#else
#define MyLog(...)
#endif
其中DEBUG是xcode自動生成的一個宏,可以自己選擇
notes:
PCH使用時,一定要注意,為了確保PCH中的代碼只在OC中生效,一定要加上條件編譯,避免項目中有C代碼時,報錯。一般按照如下方式定義:
#ifdef __OBJC__
#ifdef DEBUG
#define MyLog(...) NSLog(__VA_ARGS__)
#else
#define MyLog(...)
#endif
#endif
PCH文件能一定程度上方便我們的開發,但是也有一定的弊端,如何取舍,還需多多斟酌。