17

私は最近、スピーカーが使用しても違いはないと言ったチュートリアルを見ました:

#import "Class.h"

また:

@class Class;

そして、私が言わなければならないのは、私のアプリは何らかの形で機能するということです。しかし、違いがあるはずですよね?だから私はあなたたちに尋ねると思いました。

前もって感謝します!

4

2 に答える 2

29

「#import」は、問題のヘッダー ファイル全体を現在のファイルに取り込みます。そのファイルが#importするすべてのファイルも含まれます。

一方、 @classは、(いくつかのクラス名を持つ行で単独で使用された場合)、コンパイラに「ねえ、すぐに新しいトークンが表示されます。それはクラスなので、そのように扱ってください)」と伝えます。

これは、「循環インクルード」の可能性がある場合に非常に便利です。つまり、Object1.h は Object2 を参照し、Object2.h は Object1 を参照します。他のファイルに#import bothファイルすると、コンパイラは Object1.h を試行し、それを調べて#importObject2.h を確認するため、混乱する可能性があります。Object2.hを試行し#import、Object1.h などを確認します。

一方、これらのファイルのそれぞれに@classObject1 がある場合。または@classObject2; の場合、循環参照はありません。実際#importに必要なヘッダーを実装 (.m) ファイルに入れるようにしてください。

例えば

と言う@class myClassと、コンパイラは次のようなものになる可能性があることを認識しています。

myClass *myObject;

myClass が有効なクラスであること以外は心配する必要はなく、それへのポインター (実際には単なるポインター) 用のスペースを確保する必要があります。したがって、ヘッダーでは、@class90% の時間で十分です。

ただし、myObject のメンバーを作成またはアクセスする必要がある場合は、それらのメソッドが何であるかをコンパイラに知らせる必要があります。この時点で (おそらく実装ファイル内で)、#import "myClass.h"コンパイラに「これはクラスです」以外の追加情報を伝える必要があります。

于 2013-10-19T12:27:18.887 に答える
5

Appleのドキュメントによると:

@class を使用すると、クラスを定義するヘッダー ファイルを #import しなくても、シンボルが Objective-c クラス名であることを宣言できます。

これは、クラスへのポインターまたはクラスのメソッド パラメーターを宣言する目的で定義されたクラス名のみが必要であり、クラス内のメソッド、フィールド、またはプロパティにアクセスする必要がない場合に使用します。

#import に比べてコンパイル時間がわずかに短縮され、面倒なインクルードの循環性の問題を回避するのに役立つ場合があります。

ここから素晴らしい答え

たとえば、プロトコルを作成する場合:

@class yourCustomView;

@protocol yourCustomViewDelegate <NSObject>

@required

- (void) somethingDidInView:(UIView*)view;

@end

@interface yourCustomView : FIView
于 2013-10-19T10:40:03.967 に答える