Понимание нескольких упоминаний протокола делегата в примере кода - PullRequest
3 голосов
/ 11 июня 2011

Я получил этот код из одного из примеров Apple:

@protocol SectionHeaderViewDelegate;


@interface SectionHeaderView : UIView {
}

@property (nonatomic, retain) UILabel *titleLabel;
@property (nonatomic, retain) UIButton *disclosureButton;
@property (nonatomic, assign) NSInteger section;
@property (nonatomic, assign) id <SectionHeaderViewDelegate> delegate;

-(id)initWithFrame:(CGRect)frame title:(NSString*)title section:(NSInteger)sectionNumber delegate:(id <SectionHeaderViewDelegate>)aDelegate;
-(void)toggleOpenWithUserAction:(BOOL)userAction;

@end



/*
 Protocol to be adopted by the section header's delegate; the section header tells its delegate when the section should be opened and closed.
 */
@protocol SectionHeaderViewDelegate <NSObject>

@optional
-(void)sectionHeaderView:(SectionHeaderView*)sectionHeaderView sectionOpened:(NSInteger)section;
-(void)sectionHeaderView:(SectionHeaderView*)sectionHeaderView sectionClosed:(NSInteger)section;

@end

Я запутался в некоторых обозначениях. Это моя попытка объяснить это. Пожалуйста, поправьте меня, если я ошибаюсь:

Первый @protocol SectionHeaderViewDelegate; объявляет начало протокола для класса SectionHeaderView. Четвертое свойство, id <SectionHeaderViewDelegate> delegate;, необходимо для классов, которые соответствуют протоколу, поэтому они могут делать что-то вроде instanceOfClass.delegate = self;.

Затем после /* comment */ я не уверен, почему директива протокола используется снова. Это часть того же протокола? Отличается ли он от протокола, объявленного в первой половине?

Правильно ли мое объяснение и понимание кода выше?

Ответы [ 3 ]

6 голосов
/ 11 июня 2011

На самом деле первая protocol декларация является форвардной декларацией для решения проблемы курицы и яйца.И класс делегата, и протокол делегата должны знать друг о друге, поэтому для решения этой проблемы мы объявляем @protocol SectionHeaderViewDelegate; в качестве предварительного объявления о том, что оно еще не определено, но будет, и вам не нужно об этом беспокоитьсяЭто работает, когда вы делаете id<SectionHeaderViewDelegate> delegate в классе SectionHeaderView.Следующее объявление @protocol должно сигнализировать о фактическом начале определения протокола.

0 голосов
/ 11 июня 2011

Первый @protocol SectionHeaderViewDelegate сообщает классу, что существует протокол с таким именем (чтобы избежать ошибки компиляции)

4-е свойство делегат означает, что существует атрибут с именем делегат, который можетКласс (id) и реализующий протокол "SectionHeaderViewDelegate"

И в конце файла протокол определяется с помощью методов imeplent

0 голосов
/ 11 июня 2011

Первый @protocol является предварительным объявлением протокола.Он имеет вид @protocol SuchAndSuch; - обратите внимание на точку с запятой - и он просто сообщает компилятору: «Протокол с этим именем существует, поэтому разрешите использовать имя везде, где ожидается протокол».

Время секунда после комментария соответствует фактическому определению протокола.На этот раз он имеет вид @protocol SuchAndSuch … @end.

...