oc中的委托模式
通过一个例子来理解委托模式
首先定义个协议
协议(protocol) :它可以声明一些必须实现的方法和选择实现的方法 (在java中称为接口)
//
// StudentDelegate.h
// test
//
// Created by 洪东楗 on 2017/4/19.
// Copyright © 2017年 洪东楗. All rights reserved.
// #import <Foundation/Foundation.h> @protocol StudentDelegate <NSObject> @optional
- (void)write;
@end
这个协议表示,你可以选择性的实现write这个方法
我们接着定义一个通用类
通用类:就好比NSTexiField,你想要调用的
//
// Student.h
// test
//
// Created by 洪东楗 on 2017/4/19.
// Copyright © 2017年 洪东楗. All rights reserved.
// #import <Foundation/Foundation.h>
#import "StudentDelegate.h"
@interface Student : NSObject
@property (assign) id<StudentDelegate> delegate;
- (void)read;
@end
//
// Student.m
// test
//
// Created by 洪东楗 on 2017/4/19.
// Copyright © 2017年 洪东楗. All rights reserved.
// #import "Student.h" @implementation Student
- (void)read {
if ([_delegate respondsToSelector:@selector(write)]) {
[_deleage write];
NSLog(@"read success");
} else {
NSLog(@"read failed");
}
}
@end
这Student.h这个文件中 ,导入了刚刚所定义的协议StudentDelegate.h,并声明了一个delegate属性,这个属性是id类型的,id就是一个可以指向任何对象的指针,在这里指明了是StudentDelegate这个协议,并声明了read这个方法。
在Student.m这个文件中,实现了read方法。并在方法中表示,如果delegate这个对象,实现了write这个方法,那么就调用write方法,并输出"read success",否则输出"read failed"。
接着我们开始使用这个通用类
//
// ViewController.m
// test
//
// Created by 洪东楗 on 2017/4/19.
// Copyright © 2017年 洪东楗. All rights reserved.
// #import "ViewController.h"
#import "Student.h" @interface ViewController () <StudentDelegate>@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
Student *s = [[Student alloc] init];
s.deleage = self;
[s read];
//s.num = 10;
// Do any additional setup after loading the view, typically from a nib.
} - (void)write{
NSLog(@"success");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
在这里,通过实现StudentDelegate这个协议,让read方法去调用这个wirte
这就是一个委托,我调用Student对象中的read, Student对象就会自己判断是否有write,有则先调用write,否则输出read failed。
接下来是我个人的推断:
这就好比NSTextField,如果你实现了NSTextFieldDelegate这个协议中的textFieldDidBeginEditing这个方法,NSTextField对象就会在你点击textfield,准备输入时,自动的调用textFieldDidBeginEditing。
- (void)textFieldDidBeginEditing:(UITextField *)textField {
NSLog(@"begin");
}
如这个,它就会自己在控制台输出begin。
oc中的委托模式的更多相关文章
- Objective-C中的委托(代理)模式
我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...
- OC中的代理模式
OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的.这里举一个简单的例子:小孩类,护士类,保姆类,其中小孩类有两个方法 ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- C# 中的委托和事件
觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...
- C# 中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件(转载)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- 《C#高级编程》学习笔记------C#中的委托和事件(续)
本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...
- c#中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
随机推荐
- 实现网站页面的QQ临时会话,分享到空间微博等按钮.
一 qq临时会话 要实现qq临时会话首先要到qq在线状态官网开通qq在线状态,其中临时对话也分为加密和未加密. 1.1:加密模式 <a target="_blank" hre ...
- Spring Boot Security
如图,是一种通用的用户权限模型.一般情况下会有5张表,分别是:用户表,角色表,权限表,用户角色关系表,角色权限对应表. 一般,资源分配时是基于角色的(即,资源访问权限赋给角色,用户通过角色进而拥有权限 ...
- 分享一个很通用c语言的Makefile
编写Makefile是一个苦乐交织的事情,快乐是因为从一堆需要手工逐个处理的编译过程,进步到一条命令完成,看着代码顺畅的在屏幕上滚动,编译为最终的产品,那个过程无比愉悦:而痛苦则是,写代码已经很累了, ...
- .net core使用Pipelines进行消息IO合并
之前的文章讲述过通过IO合并实现百万级RPS和千万级消息推送,但这两篇文章只是简单地讲了一下原理和测试结果并没有在代码实现上的讲解,这一编文章主要通过代码的实现来讲述消息IO合并的原理.其实在早期的版 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌图片:自己的图片控件
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- 前端笔记之JavaScript(一)初识JavaScript
一.JavaScript简介 1.1网页分层 web前端一共分三层: 结构层 HTML : 负责搭建页面结构 样式层 CSS : 负责页面的美观 行为层 JavaSc ...
- IDEA使用总结
IDEA常用设置 在我们第一眼看见IDEA是这个样子的: 显示工具条 我们要显示工具条!,两个按钮哦 黑色主体 我们要黑色的主题,白色的太low了! 调整字体大小 现在的字体太小了,我要鼠标滑轮+cr ...
- 为容器化的 Go 程序搭建 CI
本文介绍如何使用 Jenkins 的声明式 pipeline 为一个简单的 Golang web 应用搭建 CI 环境.如果你还不太了解 Jenkins 及其声明式 pipeline,请先参考笔者的 ...
- Spring Boot(十三)RabbitMQ安装与集成
一.前言 RabbitMQ是一个开源的消息代理软件(面向消息的中间件),它的核心作用就是创建消息队列,异步接收和发送消息,MQ的全程是:Message Queue中文的意思是消息队列. 1.1 使用场 ...
- Puppet部署Nginx返代示例
一.创建目录并编辑Nginx安装模块 mkdir -pv /etc/puppet/modules/nginx/{manifests,files,templates,spec,tests,lib} ]# ...