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: listener:listener];
//设置监听
[mButton setListener:listener];
//触发事件
[mButton performClick];
//释放listener
[listener release];
//button对象是autorelease的,所以我们不需要去维护
}
return ;
}

  

[OC笔记] protocol之我的见解的更多相关文章

  1. oc中protocol、category和继承的区别

    OC中protocol.category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下. 利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"( ...

  2. [OC笔记] Category分类之见解

    用过别的语言做过开发的同学都知道,如果你想扩充一个类,就应该去继承这个类.但是OC里面有更好的方法,那就是分类. 那什么是分类呢?就是在不改变原先类,我们可以在其中添加咱们自定义的方法,这样和同事合作 ...

  3. OC中protocol、category和继承的关系--转

    开放封闭原则(OCP)就是,“对扩展开放,对更改封闭”.是所有面向对象设计的一个核心宗旨.感兴趣的可以看百度百科的一些解释:http://baike.baidu.com/view/2493421.ht ...

  4. OC笔记一:Objective-C简介

    1.OC简介 全称:Objective-C,是扩充C的面向对象编程语言,主要用于iOS和Mac OS开发. C语言的基础上,增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码 ...

  5. [OC笔记]@property之个人理解,大神轻拍

    /** * 一个简单的对象 * * @author suzhen * */ public class SimpleObjcet { /** * 声明一个age字段 */ private Object ...

  6. OC笔记一:Objective

    1.OC简介 全称:Objective-C,是扩充C的面向对象编程语言,主要用于iOS和Mac OS开发. C语言的基础上,增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码 ...

  7. [OC笔记]我的第一个OC程序

    这是我第一个OC程序,详情都写在了注释里面,讲的是Student和Book这两个类的创建和使用.(是不是觉得student这个类在各种语言入门代码里经常出现呢?真实有爱) 看完这些,你会发现,咱们其实 ...

  8. OC之protocol监听器的实现

    画图 图解 代码 总结 一.画图 本人画了一个图(字体和画图水平请忽略) 二.图解 1.首先我们上边是一个按钮的类,按钮当中包括了一条线,这个线是什么呢? 其实难理解就难理解到这条线上了 1⃣️这条线 ...

  9. oc语言--protocol(协议)

    一.protocol 1.基本用途 1> 可以用来声明很多方法,但是不能用来声明成员变量 2> 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 3> 只要父类遵守了某 ...

随机推荐

  1. URL中文转码问题

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  2. Java的常用对象①②

    Java的常用对象① Java的常用对象有很多,这里只对lang包中常用的Object,Date(Calendar,DateFormat,Math),System,Runtime进行介绍.㈠Objec ...

  3. WPF 容器的Z顺序操作

    当需要动态添加.修改.删除控件时,如果要达到最好的效果,肯定不只是把需要的控件添加到容器中,并且还需要把容器中的已有控件进行排序操作(置顶.置底.前移.后移操作).由于初次接触到wpf,所以对很多知识 ...

  4. mvc图片上传到服务器

    链接:http://www.lanhusoft.com/Article/406.html

  5. cacti应用

    cacti被很多IDC/CDN提供商用来进行带宽计算使用:带宽的95计费(95th Percentile charging) 95计费法是CDN常用计费方法: CDN基本上是每月结一次款.每5分钟取一 ...

  6. 艺术品照片融合到背景墙上效果及DEMO

    演示地址: 功能:图片按照角度增加阴影,比较复杂的功能就是当墙面是不规则的时候,贴的艺术品必须按照墙面的角度进行变形处理.

  7. 图解GitHub基本操作

    目录 一.注册并登陆到github网站 1.1.打开github网站首页(https://github.com/) 1.2.注册一个自己的github账号 1.3.登陆自己的github账号 二.创建 ...

  8. cx_Oracle 中文乱码问题解决

    设置NLS_LANG环境变量 import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

  9. Nodejs+Express创建HTTPS服务器

    为了使我的Nodejs服务器提供HTTPS服务,学习了一下如何利用express创建https服务器,现记录如下.(一点一点的积累与掌握吧) 1. Http与Https 介绍 HTTP: 超文本传输协 ...

  10. ES6学习笔记(2)

    变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,被称为解构(Destructuring); 数组的解构赋值 let [a, b, c] = [1, 2, 3]; cons ...