標籤:pch precompile xcode 6 build settings
在Xcode 4, 5的模板工程中可以看到Precompile Prefix Header,但是在Xcode 6被閹割掉了,原因可以參考下面兩個連結:
http://stackoverflow.com/questions/24158648/why-isnt-projectname-prefix-pch-created-automatically-in-xcode-6
http://blog.csdn.net/lihuiqwertyuiop/article/details/39268101#comments
個人理解,Xcode 6去掉Precompile Prefix Header的主要原因在於:
(1)去掉自動匯入的系統架構類庫的標頭檔,可以提高原檔案的複用性,便於遷移。
(2)一個肥胖無比的Prefix Header會大大增加Build Time。
為了取代在Prefix Header中自動匯入的架構,可以在每一個需要匯入系統架構的檔案中通過@import來手動匯入,當然要確保Build Settings中的Enable Modules是開啟的。
如果在Prefix Header中匯入了<objc/runtime.h>,那麼我們在工程的每一個檔案中可以免費獲得使用<objc/runtime.h>的權利,而無需手動在每一個.h/.m檔案中匯入<objc/runtime.h>。該檔案確有其方便之處。
因此,如果一定要用到Precompile Prefix Header,可以參考Xcode 5的配置來手動設定。
(1)在工程中增加一個pch檔案,命名還是按照Xcode 5的模板比較好:工程名-Prefix.pch,例如a-Prefx.pch
(2)設定Build Settings
其中Prefix Header指定pch檔案的位置。
注意:開關Precompile Prefix Header時,pch的編譯和匯入機制是有很大不同的。
如果Precompile Prefix Header為YES,那麼pch會被先行編譯,先行編譯後的pch檔案會被緩衝起來,從而提高編譯速度。可以從下面的Build Log中看出:
如果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檔案的依賴性,便於日後的遷移和解耦。
Xcode Precompile Prefix Header淺析