1. ホーム
  2. objective-c

[解決済み] クラス vs. #インポート

2022-03-14 14:46:25

質問

クラスAがクラスBのヘッダーを含む必要があり、クラスBがクラスAのヘッダーを含む必要がある場合、循環インクルージョンを避けるために、フォワードクラス宣言を使用する必要があると私は理解しています。また #import は、単純な ifndef インクルードが一度しか起こらないようにするためです。

私の質問はこうです。どのような場合に #import を使用し、どのような場合に @class ? 時々、もし私が @class のような、よくあるコンパイラの警告が表示されるのですが。

warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.

を削除した場合と比較して、この点をぜひとも理解したいと思います。 @class を前方に宣言し #import を追加して、コンパイラが出す警告を消しました。

解決方法は?

この警告が表示された場合。

<ブロッククオート

警告: レシーバ 'MyCoolClass' はフォワードクラスであり、対応する @interface が存在しない可能性があります。

が必要です。 #import というファイルがありますが、これは実装ファイル(.m)で行い、その中で @class をヘッダーファイルで宣言してください。

@class は、(通常)必要なくなりません。 #import ファイルを作成することで、必要な情報をより有用な場所に移動させることができます。

もし、あなたが @class MyCoolClass のようなものを見る可能性があることをコンパイラは知っています。

MyCoolClass *myObject;

以外を気にする必要はない。 MyCoolClass は有効なクラスであり、それへのポインタのためのスペースを確保する必要があります (実際には単なるポインタです)。したがって、あなたのヘッダで @class 90%はこれで十分です。

しかし、もしあなたが myObject のメンバは、それらのメソッドが何であるかをコンパイラに知らせる必要があります。この時点で(おそらく実装ファイルの中で)、以下のようにする必要があります。 #import "MyCoolClass.h" というように、コンパイラに単なるクラス名以上の情報を伝える必要があります。