我从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 */
之后,我不确定为什么再次使用协议指令。它是同一协议的一部分吗?它与上半年宣布的协议不同吗?
我对上述代码的解释和理解是否正确?
答案 0 :(得分:6)
实际上,第一个protocol
声明是解决鸡和蛋问题的前瞻性声明。代理协议需要彼此了解的委托者类,所以为了解决这个问题,我们将@protocol SectionHeaderViewDelegate;
声明为前向声明,说明它尚未定义,但它会在那里,你不必担心它。当您在id<SectionHeaderViewDelegate> delegate
课程中SectionHeaderView
时,此功能正常。下一个@protocol
声明用于表示协议定义的实际开始。
答案 1 :(得分:0)
第一个@protocol
是协议的前向声明。它的形式为@protocol SuchAndSuch;
- 注意分号 - 它只是告诉编译器“有一个具有此名称的协议,因此允许在预期协议的任何地方使用该名称”。
评论之后的第二时间是实际定义协议的时间。那个时候,它的形式是@protocol SuchAndSuch … @end
。
答案 2 :(得分:0)
第一个@protocol SectionHeaderViewDelegate告诉该类有一个具有此名称的协议(对于avoir编译错误)
第4个属性,委托表示存在名为“delegate”的属性,该属性可以是任何Class(id)并且实现协议“SectionHeaderViewDelegate”
在文件的最后,使用imeplent的方法定义协议