【问题标题】:Cocoa: Build Warning that s Forward Declared Class's and @interface May not ExistCocoa:构建警告,前向声明的类和@interface 可能不存在
【发布时间】:2010-03-05 12:34:19
【问题描述】:

我正在尝试在 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];

谁能帮我克服这些警告?

【问题讨论】:

    标签: objective-c cocoa forward-declaration


    【解决方案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) 文件中使用。

    【讨论】:

    • 我已经完成了你所说的更改,但我必须对你所说的方法进行一些更改,如下所示 - Forwardclass anIvar;替换为 Forwardclass *anIvar; @property Forwardclass anIvar;被@property(nonatomic, retain) Forwardclass *anIvar;在进行这些更改和您告知的更改后,当我尝试构建项目时,警告消息更改为警告:使用属性需要 Mac OS X 版本 10.5 或更高版本
    • 豹是 10.5。您必须运行 10.5 才能获得 Objective-C 2.0 和属性。
    【解决方案2】:

    这不是@class 的用途。

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

    你的情况不同。你在那个类实现文件中。

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

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

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

    #import "ClusteringController.h"
    

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

    【讨论】:

    • #import "ClusteringController.h" 行已经在实现文件中了。
    • Shakti:把它放在最后没有帮助。 @interface(也就是#import)必须在@implementation之上。您需要在 ClusteringController 和使用它的任何类的实现文件中导入 @implementation 上方的该标头。另外,请确保您没有以某种方式意外地从标题中删除 @interface,并检查拼写错误(声明 @interface ClusteringController 然后引用 ClustreingController 将不起作用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多