Какао: предупреждение о том, что класс, объявленный вперёд, и @interface могут не существовать - PullRequest
0 голосов
/ 05 марта 2010

Я пытаюсь собрать Clustering Plug в своем проекте под 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];

Может кто-нибудь помочь мне преодолеть эти предупреждения?

Ответы [ 2 ]

1 голос
/ 05 марта 2010

Это не то, для чего @class.

Вы используете @class в заголовочном файле для другого класса , чтобы сообщить компилятору о том, что класс, который вы объявляете, существует. Без этого компилятор не знал бы, что это имя класса, и когда вы объявляете переменную как содержащую указатель на экземпляр этого класса, компилятор думает, что вы просто составляете слова. Использование @class называется объявлением класса вперед.

У вас другая ситуация. Вы находитесь в файле реализации для этого класса .

Теперь вам нужен компилятор - @interface класса. Предупреждение говорит вам, что компилятору нужен @interface, но вы его не дали (поэтому, насколько он знает, @interface «может не существовать»).

Обычно вы бы написали @interface в заголовочном файле; как теперь получить его в файле реализации?

Вот тут и вступает препроцессор со своей директивой #import. В верхней части файла реализации (ClusteringController.m) импортируйте файл заголовка:

#import "ClusteringController.h"

Препроцессор заменит это содержимым этого файла, а затем передаст предварительно обработанный код компилятору, который увидит @interface там.

1 голос
/ 05 марта 2010

Прямое объявление используется, когда заголовочный файл будет импортирован после интерфейса.Мне кажется, что вы использовали директиву @class после интерфейса для самого класса.

Обычное использование объявления класса forward выглядит так:

#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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...