ビューを切り替えるためにRootViewController
というクラスを利用するマルチビューアプリを作成しています。
MyAppDelegate
ヘッダーで、RootViewController
というrootViewController
のインスタンスを作成します。 @classディレクティブが「前方クラス宣言」として使用される例を見てきましたが、これが何を意味し、何を達成するのかはよくわかりません。
#import <UIKit/UIKit.h>
@class RootViewController;
@interface MyAppDelegate
.
.
.
基本的には、コンパイラにクラスRootViewController
が存在することを伝えますが、どのように見えるか(つまり、メソッド、プロパティなど)を正確に指定することはありません。これを使用して、完全なクラス宣言を含めることなく、RootViewController
メンバー変数を含むコードを記述できます。
これは、循環依存関係の解決に特に役立ちます。たとえば、ClassA
にはClassB*
型のメンバーがあり、ClassB
にはClassA*
型のメンバーがあります。 ClassB
で使用する前にClassA
を宣言する必要がありますが、ClassA
で使用する前にClassB
を宣言する必要もあります。前方宣言により、ClassB's
完全な仕様を実際に指定することなく、ClassA
が存在することをClassB
に伝えることでこれを克服できます。
多くの前方宣言を見つける傾向がある別の理由は、完全な宣言を絶対に含める必要がある場合を除き、一部の人々が前方宣言クラスの規則を採用していることです。完全に思い出すわけではありませんが、多分それはAppleがObjective-Cのガイドスタイルのガイドラインを推奨していることです。
上記の例を続けると、ClassA
とClassB
の宣言がそれぞれClassA.h
とClassB.h
ファイルにある場合、#import
のいずれかが必要です1つは他のクラスで宣言を使用します。前方宣言を使用すると、#import
が不要になり、コードがきれいになります(特に、かなりの数のクラスの収集を開始すると、各クラスで使用される#importが必要になります)。特定のファイルをコンパイルする際にコンパイラが考慮する必要があるコードの量を最小限に抑えることにより。
余談ですが、質問はObjective-Cの前方宣言のみに関係していますが、すべての進行中のコメントはCおよびC++(およびおそらく他の多くの言語)のコーディングにも等しく適用され、前方宣言もサポートし、通常は同じ目的。
前方宣言は、主に循環インポートを回避するためのものです。1つのファイルが最初のファイルなどをインポートする別のファイルをインポートします。コンパイラに。循環インポートがある場合、コンパイルされない無限ループになります。幸いなことに、xcodeはこれを試行する前に通知します。前方宣言では、「このクラスをインポートしないで、そのクラスが存在することを知っているだけです」と記述されています。インポート宣言または前方宣言がなければ、そのようなクラスは存在しないというエラーが発生します。