了解示例代码中的多个委托协议

时间:2011-06-10 22:32:43

标签: objective-c ios cocoa-touch delegates protocols

我从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 个答案:

答案 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的方法定义协议