Xcode6關於Pch文件

在Xcode6以前新建項目,系統會幫咱們自動新建一個以工程名爲名字的pch (precompile header)文件,在Supporting FIles文件下會看到一個以  -Prefix.pch結尾文件的文件,pch全稱是「precompiled header」,也就是預編譯頭文件,該文件裏存放的工程中一些不常被修改的代碼,好比經常使用的框架頭文件,在開發過程當中,能夠將那些整個工程都普遍使用的頭文件包含在該文件下,編譯器就會自動的將pch文件中的頭文件添加到全部的源文件中去,這樣在須要使用相關類的時候不須要使用import就能夠直接使用頭文件中的內容,很大程度上帶來了編程的便利性,但潛在的也帶來了一些問題,這也是在Xcode6中默認再也不建立pch的緣由吧。編程

我的理解,Xcode 6去掉Precompile Prefix Header的主要緣由在於:緩存

(1)去掉自動導入的系統框架類庫的頭文件,能夠提升原文件的複用性,便於遷移。框架

(2)一個肥胖無比的Prefix Header會大大增長編譯時間。ui

爲了取代在Prefix Header中自動導入的框架,能夠在每個須要導入系統框架的文件中經過@import來手動導入,固然要確保Build Settings中的Enable Modules是打開的。spa

若是在Prefix Header中導入了<objc/runtime.h>,那麼咱們在工程的每個文件中能夠免費得到使用<objc/runtime.h>的權利,而無需手動在每個.h/.m文件中導入<objc/runtime.h>。該文件確有其方便之處。code

   若是必定要用到Precompile Prefix Header,那麼怎麼在Xcode6中配置Precompile Prefix Header,添加一個pch文件呢?blog

(1)Command+N,打開新建文件窗口:iOS->Other->PCH file,建立一個pch文件,記住你建立的文件名(命名最好仍是已"工程名-Prefix.pch"形式命名,例如a-Prefx.pch),等下配置路徑要用:開發

例如pch文件名叫:DaiDaiFa.pch編譯器

,編譯

(2)接下來設置Build Settings,配置一些信息(配置路徑時pch文件名要跟你當時建立時的pch文件名要相同):

 

以下圖新建了一個a-Prefix.pch文件

注意:開關Precompile Prefix Header時,pch的編譯和導入機制是有很大不一樣的。

 

 

 

有些人對Precompile Prefix Header的值可能有些疑問(Yes/No),在這裏解釋下:

(1)若是Precompile Prefix Header爲YES,那麼pch會被預編譯,預編譯後的pch文件會被緩存起來,從而提升編譯速度。
 
(2)若是Precompile Prefix Header爲NO,那麼pch不會被預編譯,而是在每個用到它導入的框架類庫的.m文件中編譯一次,下降了編譯速度。
例如a-Prefix.pch導入了<objc/runtime.h>,ViewController.m和AppDelegate.m中都使用了objc_property_t這個類型(注意ViewController.h/m和AppDelegate.h/m都沒有另外導入<objc/runtime.h>),那麼在Build的過程當中,在編譯ViewController.m和AppDelegate.m時,a-Prefix.pch會被編譯2次,每一個.m文件編譯一次。
 

若是Precompile Prefix Header爲NO,那麼每一個引用了pch內容的.m文件都要編譯一次pch,可能Apple會另外作緩存機制,可是這樣仍是下降了編譯的速度。

 既然Apple標準都建議咱們不用pch了,那麼仍是儘可能少用吧。固然,若是必定要用,仍是儘可能減小pch文件中的內容,下降工程對pch文件的依賴性,便於往後的遷移和解耦。

相關文章
相關標籤/搜索