#import
ヘッダーと実装はどこにありますか?
私が何をすべきかに関する規則はありますか?
すべてを単一のヘッダーファイルにインポートする方法はありますか?
4 に答える
「非常に大規模なプロジェクトで#importを使用するための一般的なガイドライン。」
この点で、Objective-C は C や C++ によく似ています。すべての#include
s/ #import
s をヘッダーに詰め込むと、多くの不要な依存関係が導入され、ビルドに多くの時間が追加されます。そのため、C および C++ の依存関係に関するトピックで詳細情報を探すこともできます。
ヘッダーと実装をどこに #import しますか?
通常、#import
物理的な依存関係が存在する場合にのみ記述してください。すべての objc オブジェクトは参照カウントされ、通常、プロパティ/ivar はヘッダーに存在する必要がないため、#import
s は C++ よりもはるかに低くなります。
Robin van Dijke は、彼の回答 (+1) で身体依存の一般的なケースを概説しました。
私が何をすべきかに関する規則はありますか?すべてを単一のヘッダー ファイルにインポートする方法はありますか?
まあ、それはあなたのプロジェクトのサイズに依存します。一部の人々は、使用するすべてのフレームワークを PCH (プリコンパイル済みヘッダー) に追加します。最も頻繁に使用するものを PCH に入れる人もいれば、PCH ファイルをまったく使用しない人もいます。ビルド時間が長くなり、プロジェクトが複雑になるほど、PCH に含める必要があるものは少なくなります。
「非常に大規模な」プロジェクトに取り組んでいる場合は、PCH に Foundation 以外を追加しないでください。
もう 1 つのよくある間違いは、一部の人は PCH を使用するため、タイプする必要が少ない (ほとんど) ことです。それに関する問題は、プロジェクトの一般的なインクルード/ヘッダーの変更であり、それが発生した場合、ターゲットを完全に再構築する必要があります。
また、ヘッダーでフレームワーク/ライブラリを使用することを避けることができれば#import
、ビルド時間を大幅に節約できます。
ヘッダーに s を追加する#import
と、依存関係がさらに広がります。数個のソース ファイルだけに表示する必要がある大量の無関係なコード/フレームワークが、実際にはソース ファイルの大部分に表示されるのは簡単です。
最後に、頻繁に変更されるヘッダーは、他のヘッダーから除外するようにしてください。
要点は、次のことを行う必要があるということです。
- 機能に基づいてプログラムを分離する
- よりも前方宣言を優先し
#import
ます。コンパイラは名前を知っている必要がありますが、オブジェクトを作成/メッセージする場合にのみインポートが必要になることがよくあります。 *.m
依存性の高い実装をファイルに保持するようにしてください。
時々、いくつかのソース ファイルの前処理された出力を確認して、実際に何が編集されているかを確認#import
すると、非常に驚くべき結果が得られる場合があります。
ノート:
- PCH は、プロジェクト内のすべての言語に対して生成する必要があります。
- 必要に応じてソースをコンパイルします。たとえば、C プログラムがある場合は、それらを ObjC としてコンパイルしないでください。
- プロジェクトの複雑さが増すにつれて、ターゲット (静的ライブラリ、モジュール、テストを論理的に分割するなど) で分割することによって得られる利益が増加します。依存性の低い依存ターゲットを正しく構造化することは、それ自体が大きなトピックです。正しく構造化されていれば、より高い頻度でビルドしてテストするのに本当に役立ちます (継続的インテグレーションを使用している場合や複数の開発者がいる場合にも重要です)。ヘッダーの依存関係と同様に、これを最初から考慮しないと、古い問題を修正するのに多くの工数がかかる可能性があります (すでに耐えられないほど遅くなってから)。
次の規則を使用できます。
次の場合にヘッダーファイルで使用#import
します-インポートされたクラスをサブクラス化します-インポートされたヘッダーファイルからプロトコルを使用します-インポートされたヘッダーファイルから他のCデータ構造(enum、struct)を使用します
例:
#import "SuperClass.h"
#import "Protocol.h"
@class SomeOtherClass
@interface Subclass : SuperClass <Protocol>
SomeOtherClass _instanceVariableToOtherClass
@end
@class
それ以外の場合は、ヘッダーファイルで使用します
他のすべての場合#import
は、.mファイルで使用します。
注:#import "class.h"
実際には次のとおりです。
#pragma once
#include "class.h"
したがって、インクルードサイクル/ループを防ぐために、すべてのクラスが1回だけインポートされるように注意してください。
最初にこの公式サイトを読んでくださいそれはあなたに役立つかもしれません。
#include
これは、ステートメントインのように似ていますC language
。
基本的に#import
、ステートメントには2つの定義があります。
1) #import "headerFile.h" // This statement is use for Import any header file in current file (UIController)
2) #import<FramWorkName> // This statement basically use for add any framework in current file (UIController)
プロジェクト内の任意の場所で任意のファイルを使用するには、ファイル(#import "fileName.h"
)をに追加します.pch file
。プレフィックスヘッダーはコンパイルされてキャッシュに保存され、コンパイル中にすべてのファイルに自動的に含まれます。これにより、コンパイルが高速化され、ファイルを使用するすべてのファイルにインポートステートメントを追加せずにファイルを含めることができます。それらは必須ではなく、変更するたびに実際にはコンパイルが遅くなります。このファイルは、プロジェクトで。を使用して利用できます.pch file extension
。
そのような:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "MyFile_Name.h"
forを使用PROTOCOL
して、他のクラスによって実装されるメソッドを定義することもできます。
キックのために、いくつかの「基本的な原則」を追加します。これは、すでに述べたほど詳細ではありませんが、全体的な「プロセス」を理解するのに役立つ場合があります。
Implementation.m
ファイルは(私が知る限り)決して#import
編集されません-それは、コンパイラーが「コンパイル」するときに「行っている」ことです。
すべてのコンパイル済み ( .m
) ファイルに「認識」させたいヘッダーは、.pch
ファイルに入れることができます。私は通常、すべてのクラスで共有されるディレクティブ、つまり などもそこに貼り付けます。そのため、すべてのファイルでそれら#import <Cocoa/Cocoa.h>
を見る必要はありません。
ヘッダー ファイルで以前に宣言されていないクラスを参照する場合、つまりAppDelegate.h
@property (nonatomic, strong) HTTPServer *http;
できます #import "HTTPServer.h" at the top of that file (or even in the
.pch`)...しかし、通常は次のように「フォワードクラス」を参照することをお勧めします...
@class HTTPServer;
@interface AppDelegate : NSObject ➜ ...
そして、#import "HTTPServer.h"
のAppDelegate
ファイル.m
に。ヘッダー ファイルにアクセスする必要がある主な理由は、メソッドを呼び出して、独自のクラスの「スコープ」内の外部クラスのインスタンスのプロパティなどを操作することです。これが、ヘッダーで単に「言及」するだけで「逃げる」ことができる理由です。実際にはまだ何もしていません。@class
他に考慮すべき唯一のことは、スタンドアロン アプリケーションを構築している場合はおそらくそうではありませんが、フレームワークやバンドルなどを構築する場合は、クラスが"API-kind- 「公開ヘッダー」ファイルを介して、「他の人」があなたのクラスについて「知る」ことができるようにする「ファイルのコピー」フェーズをビルドプロセスに追加する必要があります。そのような場合...他の人が#import
. これにより、「Umbrella フレームワーク」内のすべてのクラスにアクセスできるようになります。たとえば<Foundation/Foundation.h>
、単一の#import
... 最初の `.h' ファイルで「利用可能にする」ヘッダーが公開されています。 .
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
Xcode の前にコンパイラを使用したことがある場合、それについて考える方法は、インポートする必要があるヘッダーは-I
、コマンドラインの「Include」ディレクティブと同じであるということです。ヘッダー ファイルとステートメントをsrc/headers/header.h
含むソース コード ファイルsource.c
が与えられた場合、コンパイル コマンドは次のようになります。#include "header.h"
gcc -Iheaders/ source.c -o executable
「ログ ナビゲーター」と Xcode に移動し、すべての手順を確認することで、Xcode で何かをコンパイルするときに実際に何が起こっているかを知ることができます。