学习例子来自: http://www.cnblogs.com/kenshincui/p/3869639.html#protocol
代码结构如下,并且在main.m主程序中测试
代码实现分别如下:
LBButonDelegate协议 和 LBButon声明
#import <Foundation/Foundation.h>
@class LBButton;
@protocol LBButtonDelegate <NSObject>
@required
- (void)onClick:(LBButton*)button;
@optional
- (void)onMouseover:(LBButton*)button;
- (void)onMouseout:(LBButton* )button;
@end
@interface LBButton : NSObject
#pragma mark - 代理属性,同时约定为代理的对象必须实现的协议
@property (nonatomic, strong) id<LBButtonDelegate> delegate;
- (void)click;
@end
实现
#import "LBButton.h"
@implementation LBButton
- (void)click
{
NSLog(@"Invoke LBButton's click method.");
NSLog(@"check Button %@", self);
if ([_delegate respondsToSelector:@selector(onClick:)])
{
[_delegate onClick:self];
}
}
@end
LBListener声明:
#import <Foundation/Foundation.h>
@class LBButton;
@protocol LBButtonDelegate;
@interface LBListener : NSObject <LBButtonDelegate>
- (void)onClick:(LBButton*)button;
@end
LBListener实现:
#import "LBButton.h"
#import "LBListener.h"
@implementation LBListener
- (void)onClick:(LBButton *)button
{
NSLog(@"Invoke MyListener's onClick method.The button is:%@", button);
}
@end
main.m文件:
/** Protocol Practise **/
LBButton* button = [[LBButton alloc] init];
LBListener* listener = [[LBListener alloc] init];
button.delegate = listener;
[button click];
程序运行并放置断点如下:
输出如下:
大牛的文章将这些实现称为模拟按钮的点击事件,仔细想想,真的很有点击的问题,LBButton实例对象调用自身的方法click,然而身为LBButton实例对象的委托代理对象listener却主动调用起委托方法onclick: , 这就是委托设计模式的效果和作用!
总结起来就是,LBButton对象定义了一个id类型的委托<LBButtonDelegate>对象,将其代理人设置成LBListener对象(编程的角度来讲,即是定义了一个id类型的指针,并把这个指针指向你想要用来实现的那个对象),从而执行id类型的onClick:方法的时候是通过LBListener对象来执行的。从而实现我自己不想做,交给别人做的效果!所谓的delegate的页面间传值也不过如此嘛。而这个例子要理解起来最重要的还是对指针的熟悉理解,将委托对象delegate置为LBListener对象,而在click方法中使用LBListener对象来实现方法,并将自身self作为参数。
通过这个例子,理解UITableView的delegate就不难了。UITableView这个类本身定义了delegate和dataSource这两个委托类,并且相关的协议有一系列关于列表的方法,然而UITableView自己不会去一一实现,交给ViewController来实现,从而完成委托模式!