web-dev-qa-db-ja.com

Objective-Cでは、すべてのクラスに同じヘッダーをインポートすると、コンパイル時間が長くなりますか?

私はObjective-C/iOSプログラミングの初心者です。

プロジェクトで使用するすべてのクラスヘッダーを含む1つのヘッダーファイルを作成したいと思います。
そして、すべてのクラスヘッダーファイルにヘッダーをインポートします。

この質問のように:
同じヘッダーファイルに複数のクラスを含める

しかし、このアプローチはコンパイル時間を増やしますか?
または他に不利な点はありますか?

ヘッダーをインポートする良い方法を教えてください。

10
js_

一般に、新しく生成されたiOSプロジェクトには、プリコンパイル済みヘッダーまたはプレフィックスヘッダーと呼ばれるこの機能が付属しており、拡張子は.pchのファイルです。 。

必要なすべてのヘッダーをそこに投げることができ、Xcodeは他のものをビルドする前にそれをプリコンパイルし、それを使用してプロジェクト内の他のコンパイルユニット(例:.mファイル)をコンパイルします。

プリコンパイル済みヘッダーを使用すると、コンパイル時間が長くなる場合と増えない場合があります。一般に、共通のヘッダーやソースファイルが多数ある限り、コンパイル時間が短縮されます。

ただし、コンポーネント間の疎結合を強制したい場合、コンパイルユニットはあらゆる種類のものに暗黙の依存関係を形成する可能性があるため、プリコンパイル済みヘッダーを大きなダンプグラウンドのように扱うことは必ずしも良い習慣ではありません。

24
Shaggy Frog

1つのヘッダー内のすべてのクラスの問題は、クラスヘッダーを変更するたびに、それを含むすべてのファイルを間接的にも再コンパイルする必要があることです。一方、必要なクラスのみをインポートし、@ classを使用できる場合は、クラスを直接使用するファイルは再コンパイルする必要があります。したがって、前者の場合、後者よりもはるかに多くのコンパイルがあります。これが私が始めることをお勧めする方法です。

ただし、コードがより安定し、クラスが変更されない場合は、プリコンパイル済みヘッダーに各ファイルの同じ情報が含まれるため、すべてを1つのヘッダーに入れるとコンパイル時間が短縮されます。私がすることは、コードがそれほど変更されていないときに、成熟したクラスをフレームワークに入れ、フレームワークヘッダーにこれらすべてのクラスが含まれるようにすることです。

7
user151019

そのヘッダーファイルをプロジェクトprefix_pchファイルにインポートできます。その後、クラスで使用できます。

6
hacker

ヘッダーをグローバルにインポートする場合は、YourProject-Prefix.pchファイルでインポートする必要があります。このように見えるはずです。

#import <Availability.h>

#ifndef __IPHONE_4_0
#warning "This project uses features only available in iOS SDK 4.0 and later."
#endif

   #ifdef __OBJC__
   #import <UIKit/UIKit.h>
   #import <Foundation/Foundation.h>
   #import "YourGlobalHeader.h"
#endif

これで、すべてのクラスにYourGlobalHeader.hが自動的にインポートされました。

4
skram

すべてのヘッダーを1つのファイルに入れると、ビルドのパフォーマンスが向上する場合がありますが、おそらく違いに気付かないでしょう。

整理のために、クラスヘッダーを別のファイルに保存することをお勧めします。また、ソースファイルに必要なヘッダーのみを含めると、ビルド時間が短縮されますが、適切なビルドマシンを使用している場合は、それほど顕著ではありません。

0
ThomasW