0

Leopard のプロジェクトで Clustering Plug をビルドしようとしています。次の2つの質問があります。

プロジェクトでは、インターフェースクラスは次のように定義されています

@interface ClusteringController : NSWindowController
{
.......
.....
....
}
@end.

そして、このクラスは、前方宣言を使用して実装クラスで使用されます。

@class ClusteringController;

次に、1 つの関数で次のように使用されます。

- (long) filterImage:(NSString*) menuName
{   
    ClusteringController *cluster = [[ClusteringController alloc] init];
    [cluster showWindow:self];
    return 0;
}

このプロジェクトをビルドすると、次の警告が表示されます。

warning: receiver 'ClusteringController' is a forward class and corresponding @interface may not exist 

また、もう 1 つの警告が生成されます。

warning: no '-updateProxyWhenReconnect' method found

この警告は、次のコード行に対して発生します。

if(delegate) [delegate updateProxyWhenReconnect];

これらの警告を克服するのを手伝ってくれる人はいますか?

4

2 に答える 2

1

それ@classは目的ではありません。

別のクラス@classヘッダーファイルで、宣言しているクラスが存在することをコンパイラに通知するために使用します。これがないと、コンパイラはそれがクラス名であることを認識せず、そのクラスのインスタンスへのポインタを保持するものとして変数を宣言すると、コンパイラはあなたが単語を構成していると見なします。使用は、クラスの前方宣言と呼ばれます。@class

あなたの状況は異なります。そのクラス実装ファイルにいます。

コンパイラが今あなたから必要としているのは、クラスの@interfaceです。警告は、コンパイラにが必要であることを示していますが、コンパイラにはを@interface指定していません(したがって、コンパイラが知る限り、@interface「存在しない可能性があります」)。

通常は@interface、ヘッダーファイルにを書き込みます。どうやってそれを実装ファイルに入れるのですか?

そこで、プリプロセッサとその#importディレクティブが登場します。実装ファイル(ClusteringController.m)の上部で、ヘッダーファイルをインポートします。

#import "ClusteringController.h"

プリプロセッサはこれをそのファイルの内容に置き換え、前処理されたコードをコンパイラに渡します。コンパイラはそこを参照し@interfaceます。

于 2010-03-05T18:15:06.007 に答える
1

インターフェイスの後にヘッダー ファイルがインポートされる場合は、前方宣言が使用されます。クラス自体のインターフェースの後に @class ディレクティブを使用しているように見えます。

前方クラス宣言の通常の使用は次のようになります。

#import "SomeSuperClass.h"
@class Forwardclass;
@interface SomeClass : SomeSuperClass
{
    Forwardclass anIvar;
}
@property Forwardclass anIvar;

@end
#import "SomeClass.h"
#import "ForwardClass.h"
@implementation SomeClass
@synthesize anIvar;

-(void) setAnIvar:(ForwardClass *) aForwardClass;

@end

@class ディレクティブは、実装 (.m) ファイルでは使用されません。

于 2010-03-05T13:19:29.940 に答える