OC中的protocol就是和JAVA中interface差不多的东西,但是又不是完全一样的。这个protocol常用来实现委托,也就是自己不实现,当事件产生的时候去回调委托者。
让委托者去执行响应的动作。
咱们先定义一个Button类来模拟按钮代码如下
Button.h
#import <Foundation/Foundation.h> @class Button; @protocol ButtonEventDelegate <NSObject> -(void)onClick:(Button*)mButton btn_id:(int)btn_id; @end @interface Button : NSObject @property(nonatomic,assign) id<ButtonEventDelegate> listener; @property(nonatomic) int btn_id; -(void)performClick; +(id)buttonWithId:(int)btn_id listener:(id<ButtonEventDelegate>)listener; @end
Button.m
#import "Button.h" @implementation Button #pragma mark 快速创建一个Button +(id)buttonWithId:(int)btn_id listener:(id<ButtonEventDelegate>)listener{ Button *btnInstance=nil; if((btnInstance=[[super alloc] init])){ [btnInstance setBtn_id:btn_id]; [btnInstance setListener:listener]; [btnInstance autorelease]; } return btnInstance; } #pragma mark 用来触发点击事件 -(void)performClick{ //判断是否实现了onClick:btn_id:方法 if([[self listener] respondsToSelector:@selector(onClick:btn_id:)]){ NSLog(@"响应了事件"); [[self listener]onClick:self btn_id:[self btn_id]]; }else{ //如果没有实现onClick:btn_id:方法就不执行,这样就更加安全了 NSLog(@"没有响应事件"); } } #pragma mark 销毁 -(void)dealloc{ NSLog(@"销毁了Button>>"); [super dealloc]; } @end
接下来是protocol的实现
@protocol ButtonEventDelegate; @interface ButtonListener : NSObject <ButtonEventDelegate> @end @implementation ButtonListener -(void)onClick:(Button *)mButton btn_id:(int)btn_id{ NSLog(@"点击了按钮"); } -(void)dealloc{ NSLog(@"销毁了监听器"); [super dealloc]; } @end
组装使用
#import <Foundation/Foundation.h> #import "Button.h" #import "ButtonListener.h" int main(int argc, const char * argv[]) { @autoreleasepool { ButtonListener *listener =[[ButtonListener alloc] init]; Button *mButton =[Button buttonWithId:200 listener:listener]; //设置监听 [mButton setListener:listener]; //触发事件 [mButton performClick]; //释放listener [listener release]; //button对象是autorelease的,所以我们不需要去维护 } return 0; }
[OC笔记] protocol之我的见解,布布扣,bubuko.com
原文:http://www.cnblogs.com/louzhuhaha/p/3608519.html