0

我正在尝试在 Leopard 下的项目中构建集群插件。我有以下两个问题。

在项目中,接口类定义为

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

并且这个类用于使用前向声明的实现类:

@class ClusteringController;

然后在一个函数中它被用作:

- (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 

还产生了另一个警告:

warning: no '-updateProxyWhenReconnect' method found

此警告针对以下代码行:

if(delegate) [delegate updateProxyWhenReconnect];

任何人都可以帮助我克服这些警告吗?

4

2 回答 2

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 回答
1

那不是@class目的。

@class另一个类的文件中使用,告诉编译器你声明的类确实存在。没有它,编译器将不知道这是一个类名,并且当您将变量声明为包含指向该类实例的指针时,编译器会认为您只是在编造单词。使用称为前向声明类。@class

你的情况不同。您在该类的实现文件中。

编译器现在需要的是类的@interface. 警告告诉你编译器需要一个@interface,但你没有给它一个(所以,据它所知,@interface“可能不存在”)。

通常,您会@interface在头文件中写入;现在如何将其放入实现文件中?

这就是预处理器的用武之地,它的#import指令。在实现文件(ClusteringController.m)的顶部,导入头文件:

#import "ClusteringController.h"

预处理器将用该文件的内容替换它,然后将预处理后的代码交给编译器,编译器将在@interface那里看到。

于 2010-03-05T18:15:06.007 回答