相信很多iOS開發(fā)者都用過pch文件,在Xcode6之前,創(chuàng)建一個(gè)新工程Xcode會在Supporting files文件夾下面自動(dòng)創(chuàng)建一個(gè)“工程名-Prefix.pch”文件,也是一個(gè)頭文件,pch頭文件的內(nèi)容能被項(xiàng)目中的其他所有源文件共享和訪問。是一個(gè)預(yù)編譯文件。但是Xcode6之后,新建項(xiàng)目已經(jīng)不會自動(dòng)生成pch文件了。所以本文先講如何新建pch文件,之后在說說pch的缺點(diǎn)。
首先:我們打開項(xiàng)目工程 –> File –>New –>File,如下圖:
然后滑到最下面,選擇Other –>選擇PCH File,命名可自定義,也可以默認(rèn)系統(tǒng)的,如下圖:
點(diǎn)擊Next之后,再點(diǎn)擊Create,然后可以在Xcode的工程界面左邊,可以看到多了一個(gè)PrefixHeader.pch的文件,如下圖:
接下來,我們 選擇工程文件 –>TARGETS第一項(xiàng) –>Build Setting –>在搜索欄輸入prefix,在里面設(shè)置PrefixHeader.pch 文件的引用路徑,如下圖:
然后鼠標(biāo)雙擊 prefix Header 行右側(cè)空區(qū)域彈出輸入框 輸入"$(SRCROOT)/項(xiàng)目名稱/pch文件名"。補(bǔ)充一點(diǎn),有的時(shí)候可能記不住完整的路徑“$(SRCROOT)/XXX/XXX.pch",很簡單的方法,就是拖拽,雙擊打開prefix Heade之后,彈出了一個(gè)選項(xiàng)框,選擇對應(yīng)的pch文件之后,直接拖進(jìn)去,就行了!如圖:
添加完成以后 command + b 預(yù)編譯,看看會不會報(bào)錯(cuò),如果沒有就說明成功!
說完新建pch文件,就要說一說他的缺點(diǎn),就是Xcode6之后為什么沒有了pch文件。
首先說一下pch的作用:1.存放一些全局的宏(整個(gè)項(xiàng)目中都用得上的宏);2.用來包含一些全部的頭文件(整個(gè)項(xiàng)目中都用得上的頭文件);3.能自動(dòng)打開或者關(guān)閉日志輸出功能。
我在網(wǎng)上查到大部分都說pch降低了編譯速度,蘋果為了用戶體驗(yàn)就去掉了。在網(wǎng)上看到BearsG的博客說的很有道理,他是這樣總結(jié)的,我直接照搬過來:
問題1:那么,為什么會有很多人說pch降低編譯速度?
我想是因?yàn)槭褂梅绞讲粚Γ炊鴮?dǎo)致編譯速度降低吧。罪魁禍?zhǔn)拙褪谴罅康墓灿眯圆桓叩暮甓x和頭文件的引入。編譯的時(shí)候整個(gè)工程范圍地查找和替換這些宏定義字段,重復(fù)導(dǎo)入這些頭文件,不慢就奇怪了。
正確的使用方式:
不要把所有的宏定義都放到平常文件中,尤其是共用性較小的宏定義;
將公用性高的頭文件放到pch中,比如fundation框架等;
(整潔性原則)將零散的宏定義專門創(chuàng)建一個(gè)頭文件來放置,再導(dǎo)入到pch中,方便查看和修改;
問題2:如果不使用pch,又該如何處理公用的宏、框架和三方庫?
答案是使用繼承,在父類的頭文件中定義宏和導(dǎo)入共用框架、三方庫。需要用到的才去繼承。可以根據(jù)項(xiàng)目的框架,各個(gè)層之間分開去定義父類。如MVC中的View層,父類中可以添加控件的Category,屏幕寬高宏等。
問題3:即使知道pch的正確使用方式,為何大部分開發(fā)者也盡量不使用pch文件?
有些時(shí)候宏、框架和三方庫共用性高不高很難去界定和把握,就會造成糾結(jié)狀態(tài),干脆就不用了。另一個(gè)最大的壞處,我想是pch降低了代碼的可移植性。把類中使用的框架等放在pch中,要么你要重新去導(dǎo)入,要么把pch一同拖走,還要?jiǎng)h掉沒用的代碼,代價(jià)也是蠻大的。其博客網(wǎng)址為:iOS開發(fā)中pch文件的使用誤區(qū)探討 - BearsG - 博客頻道 - CSDN.NET
以上操作純屬個(gè)人見解,有大神路過勿噴,如有雷同純屬巧合。