フォワードクラス宣言(@class ClassA)を.hに入れ、#import"ClassA.h"を.mに入れるのが適切な方法であることを私は知っています。また、これを行うと、コンパイラが後でコンパイルできるようになることもわかっています(.mに#importするまで)。
通常、Ahで@class ClassAを使用し、Amで#import ClassA.hを追加しますが、コンパイラーはAhでClassAをコンパイルしませんが、それでもコンパイラーはAmでコンパイルする必要があります。
フォワードクラス宣言(@class ClassA)を.hに入れ、#import"ClassA.h"を.mに入れるのが適切な方法であることを私は知っています。また、これを行うと、コンパイラが後でコンパイルできるようになることもわかっています(.mに#importするまで)。
通常、Ahで@class ClassAを使用し、Amで#import ClassA.hを追加しますが、コンパイラーはAhでClassAをコンパイルしませんが、それでもコンパイラーはAmでコンパイルする必要があります。
Ahで使用することはほとんどありません@Class A
。一般的な方法は@Class B
、Ahと@Class A
Bhで使用することです。これは、.hファイルの循環依存を回避するためです。AhがBhをインポートし、BhがAhをインポートした場合、コンパイラーは循環依存関係から爆発します。
あなたの最後の文は、なぜ私たちがAhをAhにインポートしないのかを尋ねているようです。なぜそれが行われないのかはかなり明白だと思います。
ヘッダーファイル(.h)は、宣言について可能な限り最小限のことを世界に伝えることを目的としていることを忘れないでください。コンパイラに伝えるためにあります-「ねえ、いくつかのメソッドとプロパティを持つクラス(@interface)があります。これらのメソッドはこれらの他のクラスを使用します。現時点では必要なのは@classだけなので、これらの他のクラスには@classを使用します。最終的にはそのようなクラスが存在することを知っています。コンパイラーがその仕事を行えるようにするのに十分です。最終的に、リンカーはそれらのクラスが実際にどこかに存在するかどうかについて最終決定を下します。
ソースファイル(.m)は実際のインポートを行う必要があります。これは、コンパイラが、使用しようとしているメソッドとプロパティが実際に存在することを確認する必要があるためです。ただし、ヘッダーファイルはメソッドを呼び出さず、プロパティも呼び出しません。それは単に「このようなものは存在する」と述べています。
2つの理由から、.hで#importの代わりに@classを使用します。
循環依存を可能にします。
コンパイル時間を短縮します。
私は一般的に、A->BとB->Aの相互リンクがあると便利だと思います。これは、前方宣言なしでは不可能です。