object-c 协议(Protocols)和代理(Delegation)的学习

时间:2021-10-10 01:36:10

代理是Object-C中的一个重要机制,他可以将面向对象编程的封装特性进一步加强,不是自己负责的事情坚决不做,而是转而让对应的事情负责人(代理)去做。相反如果是自己需要负责的事情(作为别人的代理),会抢着去做。代理的引入真正意义上完全实现MVC的程序结构框架。

协议是对类的实现进行规约的一套标准,可以保证多个承诺实现协议的类的接口一致性。比如协议中定义了一个接口X,那承诺执行这个协议的类,就需要实现这个接口X.协议的关键性是让大家都有法可依有据可查。Object-C中很多时候,协议和代理是一起出现一起使用的,我们可以通过协议和代理来进行类与类之间的通信和交流。

抽象的描述,如果类A是类B的代理,那么类B定义出一套他的代理需要实现的接口,这套东西以协议的方式提供给A,类A实现了协议的接口,也就可以收到类B要告知他的内容。

以下是复制别人的,看着不粗

今天看到一个哥们总结delegate和protocol关系用了这样的一个比喻,觉得很贴切,拿来给大家分享一下:

把自己不想干的一些事情(洗衣做饭)找个助手来帮助你做,而你要的这个助手得有一定的能力,不是任何一个人都可以的,所以你就得有个招聘要求。好了,协议(protocol)就类似于你的招聘要求,你找到的助手就是代理(delegate)。  这样就有了  我.delegate = 助手;好了,这样以后再有洗衣做饭的活直接找助手做就可以了。

协议不是类,以@protocol关键字声明, 协议有两个对象:代理者和委托者。

代理者:实现协议的某个方法。

委托者:用自己的方法制定要实现协议的方法的对象。

协议的两个预编译指令@optional(/ˈɔpʃənl/):可以选择的方法。@required:必须执行的方法。

写个小例子:

协议:HelloworldDelegte.h

@protocol HelloworldDelegate <NSObject>

-(NSString *)getString;

@end

委托类:

ViewController.h

#import "HelloworldDelegte.h"

@interface ViewController:UIViewController

@property(nonatimic)id<HelloWorldDelegate>delegate;

@end

ViewController.m

-(void)viewDidLoad{

SecondViewController *second = [[SecondViewController alloc]init];

self.delegate = second;//指定代理对象second

NSString *str = [self.delegate getString];//获得代理方法的返回值。

}

代理类:

SecondViewController.h

#import "SetStringDelegate.h"

@interface SecondViewController:UITableBarController<SetStringDelegate>

@end

SecondViewController.h

-(NSString *)setString{

return @"helloWorld";

}

简单的代理回调也可以把代理对象设置为自身,可以在自身中实现协议方法。

@protocol HelloWorldDelegte <NSObject>

-(NSString *)setString;

@end

@protocol HelloWorldDelegate

@property(nonatomic,assign)id<HelloWorldDelegate>delegate;

-(NSString *)setString;

@end

@end

object-c 协议(Protocols)和代理(Delegation)的学习的更多相关文章

  1. 协议&lpar;Protocol&rpar; 和代理&lpar;Delegate)

    1.概念与组成 delegate是iOS中一种常见的设计模式,是一种消息传递的的方式,常见的消息传递方式还有以下几种: 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. ...

  2. &lbrack;SuProxy&rsqb;Ngnix&plus;Lua 实现SSH2&comma;LDAP&comma;ORACLE&comma;SQLSERVER等TCP&sol;IP协议分析&comma;劫持&comma;代理&comma;会话及负载

    目录 目录 目录 前言 介绍 安装 下载并拷贝 使用LuaRocks安装 运行测试 使用简介 处理器(processor)创建 通道(channel)创建 负载均衡 会话信息和会话管理 Event H ...

  3. Welcome-to-Swift-21协议&lpar;Protocols&rpar;

    协议定义了一个方法的蓝图,属性和其他适合特定任务或功能的要求.协议实际上并不提供一个这些要求的实现,它只是描述了一个实现会是什么样子.协议可以通过一个类,结构或枚举提供这些要求的具体实现.满足要求的任 ...

  4. HTTP权威协议笔记-6&period;代理

    6.1 Web的中间实体 Http的代理服务器即是客户端的服务器又是服务器的客户端. 它介于服务器与客户端之间,当客户端发送请求报文经过它时,它会像服务器一样正确的处理请求和返回响应,同时,代理服务器 ...

  5. 浅谈iOS开发的协议&lpar;protocol&rpar;和代理&lpar;delegate&rpar;

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...

  6. HTTP协议5之代理--转

    代理服务器 Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演“中间人”的角色. HTTP的代理服务器即是Web服务器又是Web客户端. Fiddler就是 ...

  7. http协议与http代理

    TCP/IP协议族 TCP/IP(Transmission Control Protocol/InternetProtocol.传输控制协议/网际协议)是用于计算机通信的一个协议族. TCP/IP协议 ...

  8. Object&period;defineProperties&lpar;&rpar;与Proxy对象代理

    Object.defineProperties() 了不起啊..vue.js通过它实现双向绑定的 Object.defineProperties(obj,props) 方法直接在一个对象上定义新的属性 ...

  9. HTTP协议复习二--代理

    代理(Proxy)是HTTP协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客 户端的请求,也可以转发服务器的应答.代理有很多的种类,常见的有:1.匿名代理:完全“隐匿”了被代理的机器, ...

随机推荐

  1. ms sqlserver 系列之如何查看数据链接数

    [转]如何查看SQL SERVER数据库当前连接数 1.通过管理工具开始->管理工具->性能(或者是运行里面输入mmc)然后通过添加计数器添加 SQL 的常用统计然后在下面列出的项目里面选 ...

  2. 搭建firefly服务端遇到的问题

    1 pylinter pylinter could not automatically determined the path to "lint.py" 这个错误通过安装pylin ...

  3. PyQt5实现透明电子时钟

    # -*- coding: utf-8 -*- import sys from PyQt5 import QtCore from PyQt5 import QtGui from PyQt5 impor ...

  4. LVM 移除PV步骤

    1.先查看需要收缩文件系统的使用情况,收缩后的文件系统空间不能小于已经使用的空间 df -hT 2.卸载需要收缩的文件系统(以/dev/vg0/lvm1为例) umount /dev/vg0/lvm1 ...

  5. 第十节&colon; EF的三种追踪实体状态变化方式&lpar;DBEntityEntry、ChangeTracker、Local&rpar;

    一. 简介 我们在前面章节介绍EF基本增删改的时候,曾说过EF的SaveChanges()方法,会一次性的将所有的实体的状态变化统一提交到数据库,那么你是否想过EF的实体会有哪些状态变化呢?什么原因会 ...

  6. SQL Server 性能优化实战系列&lpar;一&rpar;

    数据库服务器主要用于存储.查询.检索企业内部的信息,因此需要搭配专用的数据库系统,对服务器的兼容性.可靠性和稳定性等方面都有很高的要求.        下面是进行笼统的技术点说明,为的是让大家有一个整 ...

  7. idea 修改单个文件的 编码格式

  8. git —— pycharm&plus;git管理&sol;编辑项目

    pycharm+git  管理/编辑项目 一.pycharm中配置github 二.配置git 并不是配置了GitHub就可以的.还需要配置一下Git 前提是本地中已经安装了git 三.把本地项目上传 ...

  9. 基于Unity3d 引擎的Android游戏优化

    原文地址:http://blog.csdn.net/jixuguo/article/details/9018669 近期项目进入收尾阶段,之前对项目做了非常多优化,mesh合并 .降低DrawCall ...

  10. SpringBoot接口返回去掉空字段

    返回的接口中存在值为null或者空的字段过滤掉 @Configuration public class JacksonConfig { @Bean @Primary @ConditionalOnMis ...