如果在不考虑交叉引用的情况下,#import “” (嵌入头文件) 在 .h 和 .m 文件中会有什么区别?求各位大神解答?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
ヘッダー ファイル内でヘッダー ファイルを参照すると、コンパイル中にインポートされたヘッダー ファイルのすべてのインターフェイス情報が完全にわかります。たとえば、B.h が A.h にインポートされた場合、将来 A.h が SubA.h にインポートされると、それが完全にわかります。 B.h は、不必要なコンパイルと低い結合度を追加します。 コンパイラーは、必要な場合にのみクラスのインターフェース情報を認識します。これにより、コンパイル時間が短縮され、結合が軽減されます。授業の合間には気温が下がります
質問者が言ったように、面接の質問であれば次のように答えてください:
.h ではなく .m でインポートするようにしてください。その理由は他の回答者によって詳しく述べられています。 .h で使用される型は、可能な限り @class で宣言してから、.m にインポートする必要があります。インポートを .h で実行する必要がある状況は 2 つだけです: 1. 継承された親クラス 2. 特定のプロトコルの実装。
.h は記述です .m は実装です 一般的に、.h で使用されるクラスは .h にインポートする必要があります .h で使用されない場合は、 .m で使用されます。 .m (または .h) でインポートできます
詳細については、コーディング標準を参照してください通常、便宜上、.h で使用されるものは .h で引用されます .m で使用されるものは .m で引用されます
どこで使用してもインポートできます.h ファイルをインポートする必要はありません。なぜインポートするのですか?
しかし、私のアプローチは基本的に.h で @Class を使用するだけで十分です.m で #import を使用する
上の人が正論を言っているとは思えません。
最大の違いは、.m で記述することで 相互参照 を効果的に削減できることだと思います。もっと注意してみると、Fundition フレームワークと UIKit フレームワークはすべて .m および Class 宣言内で参照を使用していることがわかります。 .h 内 この方法はアプリの実行時間には影響しませんが、プロジェクトが大きくなるほど、この影響はより顕著になります。
そのため、xcode6 のデフォルトのテンプレートは、コンパイル速度を向上させるために、以前のパブリック ヘッダー ファイル .pch ファイルを削除しました。
これがお役に立てば幸いです。
Objective-C 言語は動的機能をサポートしているため、コンパイル時にステートメントを指定するだけで済みますが、実行時に対応する実装が見つかります。メッセージが実際に送信されない場合、実装は対応するプロセスに従います。
インポート .h ファイルはヘッダー ファイルの宣言を導入するだけであり、コンパイル中の実装は考慮しません。そのため、対応するメソッドが .m ファイルに実装されていない場合でも、エラーは報告されません。 インポート .m ファイルは通常、実装ファイルです。もちろん、メソッド セレクター -> IMP 関係テーブルも実行時に見つかります。
繰り返し参照することが多いため、相互参照を防ぐことは必須です。
メッセージの動的送信については、http://www.henishuo.com/runtime-message-forwarding/
ヒント:多くの人は、#import を使用すると相互参照を防止できることを知りません。これは、#import と #include の違いでもあります。
ヘッダー ファイル内でヘッダー ファイルを参照すると、コンパイル中にインポートされたヘッダー ファイルのすべてのインターフェイス情報が完全にわかります。たとえば、B.h が A.h にインポートされた場合、将来 A.h が SubA.h にインポートされると、それが完全にわかります。 B.h は、不必要なコンパイルと低い結合度を追加します。
コンパイラーは、必要な場合にのみクラスのインターフェース情報を認識します。これにより、コンパイル時間が短縮され、結合が軽減されます。授業の合間には気温が下がります
質問者が言ったように、面接の質問であれば次のように答えてください:
.h ではなく .m でインポートするようにしてください。その理由は他の回答者によって詳しく述べられています。 .h で使用される型は、可能な限り @class で宣言してから、.m にインポートする必要があります。インポートを .h で実行する必要がある状況は 2 つだけです: 1. 継承された親クラス 2. 特定のプロトコルの実装。
.h は記述です
.m は実装です
一般的に、.h で使用されるクラスは .h にインポートする必要があります
.h で使用されない場合は、 .m で使用されます。 .m (または .h) でインポートできます
詳細については、コーディング標準を参照してください
通常、便宜上、.h で使用されるものは .h で引用されます
.m で使用されるものは .m で引用されます
どこで使用してもインポートできます
.h ファイルをインポートする必要はありません。なぜインポートするのですか?
しかし、私のアプローチは基本的に
.h で @Class を使用するだけで十分です
.m で #import を使用する
上の人が正論を言っているとは思えません。
最大の違いは、.m で記述することで 相互参照 を効果的に削減できることだと思います。もっと注意してみると、Fundition フレームワークと UIKit フレームワークはすべて .m および Class 宣言内で参照を使用していることがわかります。 .h 内 この方法はアプリの実行時間には影響しませんが、プロジェクトが大きくなるほど、この影響はより顕著になります。
そのため、xcode6 のデフォルトのテンプレートは、コンパイル速度を向上させるために、以前のパブリック ヘッダー ファイル .pch ファイルを削除しました。
これがお役に立てば幸いです。
Objective-C 言語は動的機能をサポートしているため、コンパイル時にステートメントを指定するだけで済みますが、実行時に対応する実装が見つかります。メッセージが実際に送信されない場合、実装は対応するプロセスに従います。
インポート .h ファイルはヘッダー ファイルの宣言を導入するだけであり、コンパイル中の実装は考慮しません。そのため、対応するメソッドが .m ファイルに実装されていない場合でも、エラーは報告されません。
インポート .m ファイルは通常、実装ファイルです。もちろん、メソッド セレクター -> IMP 関係テーブルも実行時に見つかります。
繰り返し参照することが多いため、相互参照を防ぐことは必須です。
メッセージの動的送信については、http://www.henishuo.com/runtime-message-forwarding/
を参照してください。ヒント:
多くの人は、#import を使用すると相互参照を防止できることを知りません。
これは、#import と #include の違いでもあります。