インスタンス宣言と変数宣言用に別々のヘッダーファイル.hがある理由がわかりません。次に、クラスファイル.mにクラスを記述します。
通訳言語のようにやってみませんか?関数を宣言し、必要に応じて参照するだけです。重複したコードがたくさん書かれているようですが、それが私にとって意味があることを願っています。
私はこの投稿のObjective-Cにヘッダーファイルを含めるコストを見つけ、それが有益であると感じました。
インスタンス宣言と変数宣言用に別々のヘッダーファイル.hがある理由がわかりません。次に、クラスファイル.mにクラスを記述します。
通訳言語のようにやってみませんか?関数を宣言し、必要に応じて参照するだけです。重複したコードがたくさん書かれているようですが、それが私にとって意味があることを願っています。
私はこの投稿のObjective-Cにヘッダーファイルを含めるコストを見つけ、それが有益であると感じました。
他の回答で言及されていないことの 1 つは、ヘッダー ファイルで定義されたメソッドが公開されていることです。ヘッダー ファイルは、他のクラスが使用できるインターフェイスを公開しますが、実装ファイル内では、次のようなものがよく見られます。
@interface MyClass (PrivateAPI)
- (void)myPrivateMethod;
@end
@implementation MyClass
// All of the method implementations.
@end
このようにして、MyClass の実装のスコープ内のコードのみが実際に myPrivateMethod を呼び出すことができます。これは、カプセル化の実践において非常に一般的で重要な手法です。
これは、厳密なルールというよりも、優れたプログラミング プラクティス/標準です。もちろん、インタープリター言語の場合と同じように、.m ファイルで宣言を行うこともできます (試してみてください)。
もう 1 つの理由は、モジュール性です。しかし、それは最初にプログラミングの基礎を学ぶことによって捕まえる必要がある大きな魚です ;)
これは C の場合とまったく同じです。ある翻訳単位内の何かに別の翻訳単位からアクセスしたい場合は、宣言する必要があります。次に、リンク時に、リンカーは、他の翻訳単位で定義されたオブジェクトの宣言にアクセスしていることを確認し、翻訳単位の境界を越えて実際に使用するように修正します。
ただし、これは、宣言が翻訳単位間で同じであることに依存します。ヘッダー ファイルがなければ、2 つの TU で同じように宣言を書き出す必要があり、1 つの TU で宣言を変更するたびに、他の TU で宣言を変更する必要があります。
ヘッダーが存在するため、ファイルを注意深く手動で同期することなく、宣言を一度記述してから、項目を使用する任意の翻訳単位に「含める」ことができます。
.h
を含めることなく、他のいくつかの場所にファイルを含めることができます.m
。これにより、毎回コードが重複することになります。
要約すると、ヘッダー(.h)を含めることにより、コンパイラーに「関数はここにあり、ここに署名があります」と伝えます(キーワードはここにありますか?)。実装(.m)を含めることにより、コンパイラーに「前に定義した関数のコードは次のとおりです」と伝えます。