Objective-Cを使用した学習ココア(ISBN:978-1-491-90139-7)で見つけることができる良い答え
モジュールは、ファイルやライブラリをプロジェクトに含めたりリンクしたりするための新しい手段です。モジュールがどのように機能し、どのような利点があるかを理解するには、Objective-Cの履歴と#importステートメントを振り返ることが重要です。使用するファイルを含めたいときは、通常、次のようなコードがいくつかあります。
#import "someFile.h"
またはフレームワークの場合:
#import <SomeLibrary/SomeFile.h>
Objective-CはCプログラミング言語のスーパーセットであるため、#import #include
ステートメントはCのステートメントを少し改良したものです。#includeステートメントは非常に単純です。コンパイル時に、インクルードファイルで見つかったすべてをコードにコピーします。これにより、重大な問題が発生することがあります。たとえば、2つのヘッダーファイルがあるSomeFileA.h
としSomeFileB.h
ます。SomeFileA.h
含むSomeFileB.h
、SomeFileB.h
含むSomeFileA.h
。これはループを作成し、ココンパイラーを混乱させる可能性があります。これに対処するには、Cプログラマーはこのタイプのイベントが発生しないようにガードを作成する必要があります。
を使用する場合#import
、この問題を心配したり、それを回避するためにヘッダーガードを作成したりする必要はありません。ただし、これ#import
はまだコピーと貼り付けの見栄えの良いアクションであり、他の多数の小さいながらも非常に危険な問題(コンパイルされたファイルが独自のコードで他の場所で宣言したものを上書きするなど)の間でコンパイル時間が遅くなります。
モジュールはこれを回避するための試みです。それらはもはやソースコードへのコピーアンドペーストではなく、必要なときに必要な場所でのみソースコードにインポートできるインクルードファイルのシリアル化された表現です。モジュールを使用すると、コードは通常、#includeまたはを使用するよりも速くコンパイルされ、安全になります#import
。
フレームワークをインポートする前の例に戻ります。
#import <SomeLibrary/SomeFile.h>
このライブラリをモジュールとしてインポートするには、コードを次のように変更します。
@import SomeLibrary;
これには、SomeLibraryフレームワークをプロジェクトに自動的にリンクするXcodeのボーナスが追加されています。モジュールを使用すると、プロジェクトに本当に必要なコンポーネントのみを含めることもできます。たとえば、AwesomeLibraryフレームワークでAwesomeObjectコンポーネントを使用する場合、通常は1つのピースを使用するためにすべてをインポートする必要があります。ただし、モジュールを使用すると、使用する特定のオブジェクトをインポートできます。
@import AwesomeLibrary.AwesomeObject;
Xcode 5で作成されたすべての新しいプロジェクトでは、モジュールはデフォルトで有効になっています。古いプロジェクトでモジュールを使用する場合は(実際に使用する必要があります)、プロジェクトのビルド設定でモジュールを有効にする必要があります。これを行うと、心配することなく、#import
と@import
ステートメントの両方をコードで一緒に使用できます。