2010-06-10 3 views
0
@protocol MyViewDelegate <NSObject> 
- (void) didFinishProcessing:(MyView*)myView; //compiler stops here with error 
@end 

@interface MyView : MySuperclass { 

id<MyViewDelegate> _delegate;  
} 

@property (nonatomic, retain) id<MyViewDelegate> delegate; 

@end 

Когда я пытаюсь скомпилировать, я получаю «expected ')' перед MyView». Где ошибка?Что не так с этим кодом?

ответ

5

До @protocol добавить строку @class MyView. В этот момент компилятор еще не знает о вашем классе MyView.

+0

отлично, теперь у меня есть еще один вопрос для вас. В чем разница между #import «MyView.h» и @class MyView ;? Я думал, что нет никакой разницы, но очевидно, что есть, потому что, если я просто импортирую класс, он не работает, поэтому мне нужна строка кода, которую вы предоставили. –

+0

Вероятно, у вас есть круговая ссылка. Поскольку протокол опирается на определение MyView, но MyView опирается на определение MyViewDelegate, он, скорее всего, потерпит неудачу. '# import' включает файл, как если бы вы его скопировали и вставляли. '@ class' - определение владельца места. В нем говорится: «Поверьте мне, что этот класс существует, во время связывания вы будете его поправлять, но на данный момент это все, что вам нужно знать». –

+0

Horatiu, @class просто сообщает компилятору не обращать внимания на любую ошибку, связанную с этим классом. #import импортирует содержимое файла, если они еще не были импортированы. В вашем случае вы уже находитесь в этом файле - я считаю, что '#import" MyView.h "внутри" MyView.h "ничего не сделает ... –

3

MyView не распознается компилятором, поэтому перед ним ожидал близкий парик. Это связано с тем, что класс определяется ниже протокола MyViewDelegate, поэтому компилятор еще не видел его. Добавить

@class MyView; 

над заявлением протокола для его исправления.

Смежные вопросы