web-dev-qa-db-ja.com

Objective-C:前方クラス宣言

ビューを切り替えるためにRootViewControllerというクラスを利用するマルチビューアプリを作成しています。

MyAppDelegateヘッダーで、RootViewControllerというrootViewControllerのインスタンスを作成します。 @classディレクティブが「前方クラス宣言」として使用される例を見てきましたが、これが何を意味し、何を達成するのかはよくわかりません。

#import <UIKit/UIKit.h>
@class RootViewController;
@interface MyAppDelegate
.
.
.
47
Old McStopher

基本的には、コンパイラにクラスRootViewControllerが存在することを伝えますが、どのように見えるか(つまり、メソッド、プロパティなど)を正確に指定することはありません。これを使用して、完全なクラス宣言を含めることなく、RootViewControllerメンバー変数を含むコードを記述できます。

これは、循環依存関係の解決に特に役立ちます。たとえば、ClassAにはClassB*型のメンバーがあり、ClassBにはClassA*型のメンバーがあります。 ClassBで使用する前にClassAを宣言する必要がありますが、ClassAで使用する前にClassBを宣言する必要もあります。前方宣言により、ClassB's完全な仕様を実際に指定することなく、ClassAが存在することをClassBに伝えることでこれを克服できます。

多くの前方宣言を見つける傾向がある別の理由は、完全な宣言を絶対に含める必要がある場合を除き、一部の人々が前方宣言クラスの規則を採用していることです。完全に思い出すわけではありませんが、多分それはAppleがObjective-Cのガイドスタイルのガイドラインを推奨していることです。

上記の例を続けると、ClassAClassBの宣言がそれぞれClassA.hClassB.hファイルにある場合、#importのいずれかが必要です1つは他のクラスで宣言を使用します。前方宣言を使用すると、#importが不要になり、コードがきれいになります(特に、かなりの数のクラスの収集を開始すると、各クラスで使用される#importが必要になります)。特定のファイルをコンパイルする際にコンパイラが考慮する必要があるコードの量を最小限に抑えることにより。

余談ですが、質問はObjective-Cの前方宣言のみに関係していますが、すべての進行中のコメントはCおよびC++(およびおそらく他の多くの言語)のコーディングにも等しく適用され、前方宣言もサポートし、通常は同じ目的。

101
Mac

前方宣言は、主に循環インポートを回避するためのものです。1つのファイルが最初のファイルなどをインポートする別のファイルをインポートします。コンパイラに。循環インポートがある場合、コンパイルされない無限ループになります。幸いなことに、xcodeはこれを試行する前に通知します。前方宣言では、「このクラスをインポートしないで、そのクラスが存在することを知っているだけです」と記述されています。インポート宣言または前方宣言がなければ、そのようなクラスは存在しないというエラーが発生します。

2
Aks