首页 > 其他 > 详细

[OC笔记] protocol之我的见解

时间:2014-03-19 06:14:02      阅读:475      评论:0      收藏:0      [点我收藏+]

OC中的protocol就是和JAVA中interface差不多的东西,但是又不是完全一样的。这个protocol常用来实现委托,也就是自己不实现,当事件产生的时候去回调委托者。

让委托者去执行响应的动作。

咱们先定义一个Button类来模拟按钮代码如下

Button.h

bubuko.com,布布扣
#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
bubuko.com,布布扣

Button.m

bubuko.com,布布扣
#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
bubuko.com,布布扣

接下来是protocol的实现

bubuko.com,布布扣
@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
bubuko.com,布布扣

组装使用

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

 

  

[OC笔记] protocol之我的见解,布布扣,bubuko.com

[OC笔记] protocol之我的见解

原文:http://www.cnblogs.com/louzhuhaha/p/3608519.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!