Objective-c では、慣習によりあるクラスのオブジェクトを別のクラスに使用する場合、.h ファイルでクラスを前方宣言する必要があります@class classname;
。また、ヘッダー ファイルを .m ファイルにインポートする必要があります#import "header.h"
。しかし、ヘッダー ファイルを .h にインポートすると、それを .m ファイルに再度インポートする必要はありません。では、この規則の背後にある理由は何ですか? 効率の良い方法は?
5 に答える
では、この規則の背後にある理由は何ですか?
可能な場合は前方宣言 ( @class MONClass;
) を優先する必要があります。これは、型名が使用される前にその型名が objc クラスであることをコンパイラが認識している必要があるためです#import
。依存関係とビルド時間の増加。
効率の良い方法は?
前方宣言。これを正しく行うと、ビルド、再構築、およびインデックス作成がはるかに高速になります。
.h にヘッダーをインポートすると、(短期的には)簡単になります。これを行わずに実装ファイル (.m) にインポートしない理由は、誰かがヘッダーをインポートしたときに、インポートされたヘッダー内のすべての名前が使用可能になるという名前の汚染を防ぐためです。代わりに、ヘッダーをインポートすることにより、関数/クラスのみをインポートし、残りは実装時にインポートする必要があります
また、ヘッダーを .h にインポートすると、サードパーティのヘッダーが変更されたときに、ヘッダーが明示的に変更されていなくても、ヘッダーをインポートしたすべてのコードを再コンパイルする必要があります。前方宣言はこの問題を回避し、サードパーティのヘッダーを実際に使用する実装 (.m) ファイルのみを強制的に再コンパイルします。
.m でファイルをインポートすると、数行のコードで簡単に回避できますが、インポートはロード時間と応答時間に影響を与える可能性があると一般的に考えられていますが、影響はありますが、影響はありません。
マスター ヘッダー ファイルをインクルードするとプログラムが肥大化するのではないかと心配している場合でも、心配する必要はありません。Mac OS X インターフェイスはフレームワークを使用して実装されるため、これらのインターフェイスのコードは、実行可能ファイルではなく動的共有ライブラリに存在します。さらに、プログラムで使用されるコードのみが実行時にメモリにロードされるため、メモリ内のフットプリントも同様に小さく保たれます。
コンパイル中に多数のヘッダー ファイルをインクルードすることについては、繰り返しになりますが、心配する必要はありません。Xcode は、コンパイル時間を短縮するプリコンパイル済みヘッダー機能を提供します。すべてのフレームワーク ヘッダーを一度にコンパイルすることにより、新しいフレームワークを追加しない限り、ヘッダーを再コンパイルする必要はありません。それまでの間、含まれているフレームワークの任意のインターフェイスを、パフォーマンスの低下をほとんどまたはまったくなくして使用できます。
したがって、応答時間と読み込み時間は初回のみ影響を受けますが、いずれにせよ、コーディング標準を維持し、オーバーヘッドを回避するために、前方参照を優先する必要があります:)。
#import
コンパイラがファイルを見る前にファイルを操作するプリプロセッサ ディレクティブです。混乱するときはいつでも、概念的にはコピー アンド ペーストのようなものだと考えてください#import foo
。(重複したインクルードも防ぐため、それよりも少し賢いです)。
その参照に宣言がある場合は#import Foo.h
、そうします。Foo を使用するものがなく、 がある場合、インポートは に入ります。宣言は必要な場所にのみ保管してください。Bar.h
Bar.h
Foo.h
Bar.h
Bar.m
Bar.m
これは、@class xx を使用すると、コンパイラに xx という名前のクラスがあると言うだけです。
そのプロパティ/メソッドは今は必要ないからです。
And in the next case, you also need the property and methods because you will have to access them. That's the issue if you use @class xx in your .h file and don't import xx.h. Then declaring an object of xx will not generate and error but accessing it's method will generate warning and accessing property generate an error