2011-07-29 8 views
18

@classの方法を使用して、私は最近、いくつかの例を見てきましたiOS 4開発で@classは何をしますか?

#import "MyViewController.h" 

appdelegate.hへの.hの通常の輸入を

@class MyViewController; 

を行うのではなくやってのいずれかの違いがあります相違があるかどうか疑問に思った。

ありがとうございました。

+0

多分この似たような質問は役に立ちます:[http://stackoverflow.com/questions/322597/class-vs-import](http://stackoverflow.com/questions/322597/class-vs-import) –

答えて

21

大きな違いがあります。

@class MyViewController; 

オブジェクトの前方宣言はMyViewControllerです。コンパイラにオブジェクト型について通知するだけで、ヘッダファイルを含める必要がないときに使用されます。

あなたがこのタイプのオブジェクトを作成し、その上のメソッドを呼び出す必要がし​​かし、あなたがする必要がある場合:

#import "MyViewController.h" 

しかし、通常、これは.mファイルで行われます。

前方宣言の追加使用は、それを使用するオブジェクトと同じヘッダーファイルに@protocolを定義する場合です。

@protocol MyProtocolDelegate; //forward declaration 

@interface MyObject { 
    id<MyProtocolDelegate> delegate; 
    ... 
} 
... 
@end 

@protocol MyProtocolDelegate 
    ... //protocol definition 
@end 

上記の例では、コンパイラは、それがMyObjectオブジェクトをコンパイルする前に、@protocol MyProtocolDelegateが有効であることを知っている必要があります。

プロトコル定義を上記のMyObjectの定義を単に動かすだけでも動作します。

6

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

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

これは、コンパイル時間と#importのごくわずかな量を節約し、時には混乱している円形度の問題を回避するのに役立ちます。

[そして、rjstellingが指摘するように、あなたが宣言をインターリーブしているし、あなたが何かを「前方宣言」する必要がある場合は、それが便利な場合があります。]

+0

偉大な、説明のおかげで。 – user868830

関連する問題