2012-06-18 3 views
1

Моего класса .h выглядит как:вперед объявить протокол в Objective-C

@protocol AppInfoDelegate; 
@class InfoTextView; 


@interface AppInfoViewController : UIViewController <AppInfoDelegate> { 

} 


@property (nonatomic, retain) NSArray *textObjectsArray; 
@property (nonatomic, retain) InfoTextView *itView; 
@property (nonatomic, retain) UIButton *pgBackButton; 
@property (nonatomic, retain) UIButton *pgFwdButton; 

@end 

@protocol AppInfoDelegate <NSObject> 
- (void)closeButtonPressed:(id)sender; 

@end 

я получаю предупреждение о том, что определение протокола для AppInfoDelegate не может быть найдено. Каков правильный способ сделать это и почему его нельзя найти? Должен ли я иметь полное определение протокола перед интерфейсом? Благодаря!

ответ

15

Использование @protocol MyProtocol; полезно, если вы утверждаете, например, что метод принимает id <MyProtocol> в качестве аргумента.

Это не полезно, если вы утверждаете, что ваш класс соответствует <MyProtocol>. Причина этого в том, что компилятору требуется полное объявление протокола, чтобы убедиться, что ваш класс фактически соответствует протоколу. (Эта проверка времени компиляции является одной из главных причин использования формальных протоколов вместо старых неформальных.)

Вы можете исправить двумя способами. Один из них, как предлагает @skram, должен просто направить - объявить все это. Это работает, но это также довольно ограничено по моему мнению. Зачем беспокоиться о протоколе в этом случае - просто поместите все в класс @interface и сделайте с ним.

Второй подход, который я предпочитаю, состоит в том, чтобы на самом деле иметь отдельный заголовок, например MyProtocol.h. Затем вы можете свободно импортировать его в любой заголовок или файлы реализации по мере необходимости. Это позволяет вам легко использовать протокол (и избегать головных болей циклического импорта, которые иногда возникают).

-1

Я всегда видел определение всего протокола перед @interface. Я полагаю, вы также можете поместить его в отдельный файл, хотя

0

Да, должны быть определены (дословно или с помощью #import) перед определением класса суперкласса и принят протокол определения. Они не могут быть просрочены.