Почему протокол определяется дважды в примере кода Apple? - PullRequest
1 голос
/ 27 апреля 2011

Я смотрю пример кода Apple для отложенной загрузки изображения таблицы .Я вижу, что у них есть две строки, начинающиеся с @protocol ParseOperationDelegate.Почему они делают это дважды?Вся документация по протоколам Objective C, на которую я смотрел, не говорит вам сделать это дважды.

@class AppRecord;

@protocol ParseOperationDelegate;

//@interface ParseOperation : NSOperation <NSXMLParserDelegate>
@interface ParseOperation : NSOperation
{
@private
    id <ParseOperationDelegate> delegate;

    NSData          *dataToParse;

    NSMutableArray  *workingArray;
    //AppRecord       *workingEntry;
    //NSMutableString *workingPropertyString;
    //NSArray         *elementsToParse;
    //BOOL            storingCharacterData;
}

- (id)initWithData:(NSData *)data delegate:(id <ParseOperationDelegate>)theDelegate;

@end

@protocol ParseOperationDelegate
- (void)didFinishParsing:(NSArray *)appList;
- (void)parseErrorOccurred:(NSError *)error;
@end

1 Ответ

6 голосов
/ 27 апреля 2011

Строка @protocol ParseOperationDelegate; не определяет протокол. Это предварительная декларация . По сути, это говорит о том, что «протокол с именем ParseOperationDelegate существует и определяется где-то еще в коде».

Они делают это, чтобы компилятор не умер с ошибкой в ​​строке, которая идет id <ParseOperationDelegate> delegate;. Альтернативой было бы поместить все определение протокола перед определением интерфейса (что лично я думаю, было бы лучшим решением в этом случае).

В таком простом случае, как этот, я думаю, нет смысла иметь предварительную декларацию. Но вы можете легко представить себе более сложный случай, когда, возможно, определение протокола находится в своем собственном заголовочном файле (или в заголовочном файле для некоторого другого класса). В таком случае использование предварительного объявления позволяет избежать необходимости #import файла заголовка протокола в заголовке вашего класса. На самом деле это небольшая разница, но она может быть полезна.

...