全ヘッダファイルを.pchに定義してみた in Xcode

C言語やObjective-Cでのライブラリのインポートって面倒ですよね。今回はそんな面倒なヘッダファイルのインポートを不要にする目的で、自作クラスのヘッダーファイルを全てXcodeプロジェクトのPCHファイルに追加してみました。これでどのクラスからもヘッダーインポート無しで他のクラスを参照することができるようになります。

PCHはプリコンパイルヘッダの略で、事前にヘッダーファイルをコンパイルしておきたい場合や環境ごとに異なるヘッダファイルを分岐する際に使用されます。今回は主にこれをヘッダ宣言省略化の目的で用いてみました。

ちなみに、PCHファイルの場所はXcodeのファイルナビゲータ内のSupporting Filesというフォルダにあり、「プロジェクト名-Prefix.pch」という名前で既に作成されているはずです。

Xcode6以降は手動で作成する必要があるようです。「Xcode > File > New > File... > Other > PCH File」でファイルを作成。「Targets > Build Settings > Prefix Header」に作成したファイルのファイルパスを追加。

こんな感じでよく使うクラスを登録していきます。

#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"
#import "UIKitCategories.h"
#import "FoundationCategory.h"
#endif
今回は実験目的で他にも100ファイル程の自作クラスを追加しています。

実験結果

コンパイルスピード

リビルド時もクリーン後のビルド時でも変化はありませんでした。遅くもならないし、速くもならないです。遅くならない理由はリンクコストがボトルネックにならないためで、速くならない理由はおそらくXcode側が普段から暗黙的にプリコンパイルを行っているからなのかもしれません。だとするとコンパイル速度向上の目的でPCHファイルを作る意味ってあまりないのかな。

リファクタリング

ものすごく遅くなりました。今までのメソッド名変換処理では依存関係にあるクラスのみの検索が行われていましたが、今はプロジェクト内全てのファイルに対して依存関係のチェックが行われています。4コアCPUモデルのMacでも15秒ほど掛かります。今までは5秒。

まとめ

リファクタリングが重くなるのでヘッダファイルのインクルード省略化目的での利用はあまりオススメしない。ちなみに静的ライブラリや動的ライブラリなら問題はない。

広告
広告