私は最近、スピーカーが使用しても違いはないと言ったチュートリアルを見ました:
#import "Class.h"
また:
@class Class;
そして、私が言わなければならないのは、私のアプリは何らかの形で機能するということです。しかし、違いがあるはずですよね?だから私はあなたたちに尋ねると思いました。
前もって感謝します!
「#import」は、問題のヘッダー ファイル全体を現在のファイルに取り込みます。そのファイルが#importするすべてのファイルも含まれます。
一方、 @classは、(いくつかのクラス名を持つ行で単独で使用された場合)、コンパイラに「ねえ、すぐに新しいトークンが表示されます。それはクラスなので、そのように扱ってください)」と伝えます。
これは、「循環インクルード」の可能性がある場合に非常に便利です。つまり、Object1.h は Object2 を参照し、Object2.h は Object1 を参照します。他のファイルに#import both
ファイルすると、コンパイラは Object1.h を試行し、それを調べて#import
Object2.h を確認するため、混乱する可能性があります。Object2.hを試行し#import
、Object1.h などを確認します。
一方、これらのファイルのそれぞれに@class
Object1 がある場合。または@class
Object2; の場合、循環参照はありません。実際#import
に必要なヘッダーを実装 (.m) ファイルに入れるようにしてください。
例えば
と言う@class myClass
と、コンパイラは次のようなものになる可能性があることを認識しています。
myClass *myObject;
myClass が有効なクラスであること以外は心配する必要はなく、それへのポインター (実際には単なるポインター) 用のスペースを確保する必要があります。したがって、ヘッダーでは、@class
90% の時間で十分です。
ただし、myObject のメンバーを作成またはアクセスする必要がある場合は、それらのメソッドが何であるかをコンパイラに知らせる必要があります。この時点で (おそらく実装ファイル内で)、#import "myClass.h"
コンパイラに「これはクラスです」以外の追加情報を伝える必要があります。
Appleのドキュメントによると:
@class を使用すると、クラスを定義するヘッダー ファイルを #import しなくても、シンボルが Objective-c クラス名であることを宣言できます。
これは、クラスへのポインターまたはクラスのメソッド パラメーターを宣言する目的で定義されたクラス名のみが必要であり、クラス内のメソッド、フィールド、またはプロパティにアクセスする必要がない場合に使用します。
#import に比べてコンパイル時間がわずかに短縮され、面倒なインクルードの循環性の問題を回避するのに役立つ場合があります。
ここから素晴らしい答え
たとえば、プロトコルを作成する場合:
@class yourCustomView;
@protocol yourCustomViewDelegate <NSObject>
@required
- (void) somethingDidInView:(UIView*)view;
@end
@interface yourCustomView : FIView