@importと#import-iOS 7


432

WWDCのビデオ「iOSでのEngaging UIの実装」で説明されているように、iOS 7のいくつかの新機能を試したり、一部の画像効果を操作したりしています。セッションのソースコード内でぼかし効果を生成するために、UIImageUIKitを次のようにインポートするカテゴリを介して拡張されました。

@import UIKit;

別のセッションビデオでこれについて何かを見たと思いますが、それを見つけるのに苦労しています。これをいつ使用するかに関する背景情報を探しています。Appleフレームワークでのみ使用できますか?このコンパイラディレクティブを使用するメリットは、古いコードに戻って更新するのに十分ですか?


回答:


838

これは、モジュールまたは「セマンティックインポート」と呼ばれる新機能です。セッション205および404のWWDC 2013ビデオに詳細があります。これは、プリコンパイル済みヘッダーのより良い実装のようなものです。iOS 7およびMavericksの任意のシステムフレームワークでモジュールを使用できます。モジュールは、フレームワーク実行可能ファイルとそのヘッダーのパッケージであり、より安全で効率的であると宣伝されています。#import

を使用する大きな利点の1つは、プロジェクト設定にフレームワークを追加する必要がない@importことですこれは自動的に行われます。つまり、プラスボタンをクリックしてフレームワーク(ゴールデンツールボックス)を検索するステップをスキップして、それを「Frameworks」グループに移動できます。不可解な「リンカーエラー」メッセージから多くの開発者を救うでしょう。

@importキーワードを実際に使用する必要はありません。モジュールの使用をオプトインする#importと、すべての#includeディレクティブとディレクティブが@import自動的に使用されるようにマッピングされます。つまり、ソースコード(または他の場所からダウンロードしたライブラリのソースコード)を変更する必要はありません。特にPCHを十分に使用していない場合やプロジェクトに小さなソースファイルが多数ある場合は特に、モジュールを使用するとビルドパフォーマンスも向上します。

モジュールは、ほとんどのAppleフレームワーク(UIKit、MapKit、GameKitなど)用に事前にビルドされています。自分で作成したフレームワークでそれらを使用できます。XcodeでSwiftフレームワークを作成すると自動的に作成され、アップルまたはサードパーティのライブラリ用に「.modulemap」ファイルを手動で作成できます

コード補完を使用して、利用可能なフレームワークのリストを表示できます。

ここに画像の説明を入力してください

Xcode 5の新しいプロジェクトでは、モジュールはデフォルトで有効になっています。古いプロジェクトでそれらを有効にするには、プロジェクトのビルド設定に移動し、「モジュール」を検索して、「モジュールを有効にする」を「はい」に設定します。「リンクフレームワーク」も「はい」である必要があります。

Xcode 5とiOS 7またはMavericks SDKを使用する必要がありますが、古いOS(iOS 4.3など)でもリリースできます。モジュールは、コードのビルド方法やソースコードを変更しません。


WWDCスライドから:

  • フレームワークの完全なセマンティック記述をインポートします
  • ヘッダーを解析する必要はありません
  • フレームワークのインターフェースをインポートするより良い方法
  • バイナリ表現をロードします
  • プリコンパイル済みヘッダーよりも柔軟
  • 地元のマクロ定義の効果に対する免疫(例えば#define readonly 0x01
  • デフォルトで新しいプロジェクトに対して有効

モジュールを明示的に使用するには:

交換する#import <Cocoa/Cocoa.h>@import Cocoa;

次の表記を使用して、ヘッダーを1つだけインポートすることもできます。

@import iAd.ADBannerView;

Xcodeでサブモジュールがオートコンプリートします。


15
@DaveDeLong&Klaas:ありがとう!私が最初にこれに答えたとき、私はモジュールについて何も知らなかったことを認めなければなりません。それを学ぶためにセッション404を見に行きました。Doug Gregor(LLVMの人)が行ったプレゼンテーションは本当によくできていました。ここで利点を説明するC ++モジュールトークもあります:youtube.com/watch
v

3
@ nevan--答えてくれてありがとう。モジュールが現在サードパーティとあなた自身のフレームワークをまだサポートしていないことを追加したかっただけです。
jamdaddy25 2013

これを自分のクラスに使用できますか?
cfischer 2013年

5
適切なmodule.mapが提供されていれば、サードパーティのフレームワークを@importできるはずです。LLVM clangモジュールのドキュメント:clang.llvm.org/docs/Modules.html#module-map-language
bames53

1
ああ、実際には@import sqlite3自分用にmodule.mapを作成していて、sqliteがOS Xに含まれていてmodule.mapが削除されていることに気付いたので、コンパイラーは古いモジュールを使用し続けたので、うまくいったようです。
bames53 2013年

46

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.hSomeFileB.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ステートメントの両方をコードで一緒に使用できます。


私のプロジェクト(Xcode 6)で、モジュールを有効にするためにXcode 4で最初に始めたオプションはありません。どういうわけか手動で追加できますか?
Awesome-o

ビルドターゲットはiOS 6です。これが問題だと思います
Awesome-o

4

現在、組み込みのシステムフレームワークでのみ機能します。#importアップルのように使用UIKitしても、アプリデリゲートにフレームワークをインポートする場合は、 フレームワークが置き換えられ(モジュールがオンになっていて、システムフレームワークとして認識されている場合)、コンパイラはそれを再インポートして、ヘッダーファイルのインポートではなくモジュールインポートにします。 。したがって、を残すことは、#importとにかく可能であればモジュールのインポートに変換されたものと同じになります



1

モジュールの使用にはいくつかの利点があります。モジュールマップが作成されていない限り、Appleのフレームワークでのみ使用できます。@importヘッダーファイルをファイルに追加するときのプリコンパイルヘッダーファイルに少し似てい.pchます。これは、アプリのコンパイルプロセスを調整する方法です。さらに、古い方法でライブラリを追加する必要はありません@import。実際に使用すると、はるかに高速で効率的です。それでも良いリファレンスを探している場合は、この記事を読むことを強くお勧めします。


0

歴史:

#include => #import => .pch => @import

#include vs #import
.pch-プリコンパイル済みヘッダー

モジュール- @import

Product Name == Product Module Name 

@module宣言は、ビルド時間短縮するフレームワークのプリコンパイル済みバイナリをロードするようコンパイラーに指示します。モジュラーフレームワークには、[について]が含まれています.modulemap

Xcodeプロジェクトでモジュール機能が有効になっていて#include#importディレクティブが自動的に変換される場合@import、すべての利点がもたらされます

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.