Protocol, Delegate

协议的构成:

  • 协议:用来指定代理双方可以做什么,必须做什么。
  • 代理:根据指定的协议,完成委托方需要实现的功能。
  • 委托:根据指定的协议,指定代理去完成什么功能。

协议的修饰符:

协议有两个修饰符@optional@required,创建一个协议如果没有声明,默认是@required状态的。这两个修饰符只是约定代理是否强制需要遵守协议,如果@required状态的方法代理没有遵守,会报一个黄色的警告,只是起一个约束的作用,没有其他功能

非正式协议:

iOS2.0之前还没有引入@Protocol正式协议之前,实现协议的功能主要是通过给NSObject添加Category的方式。这种通过Category的方式,相对于iOS2.0之后引入的@Protocol,就叫做非正式协议。

Delegate修饰符:

一般都是使用weak修饰, 我们定义的指针默认都是__strong类型的,strong类型的指针会造成强引用,必定会影响一个对象的生命周期,这也就会形成循环引用。
weakassign是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。在一个对象被释放后,weak会自动将指针指向nil,而assign则不会,所以weak更安全。

Delegate和Block选择:

1.如果对象有超过一个以上不同的事件源,使用delegate
注解:用block解决多个事件源有两种方法 1. 为每个事件源写相应的block,这显然是不合理的 2.写一个可以接受任何事件的block,这种写法不简单且不宜读;

2.一个对象只有一个delegate,所以单例对象不要使用delegate。

注解:可以想象CLLocationManager是个单例对象,当地理位置变化的时候,需要不停的切换delegate指针到所需要数据的这个单例对象上去,显然是不合理的

3.delegate面向的是过程,block面向的是结果
在delegate的数据源和代理方法中我们总是能看到,一系列的过程方法比如,我将要做什么(如:willSendRequest,将要发送请求)、到目前为止我知道的信息(如:canAuthenticateAgainstProtectionSpace)、我已经完成这些啦(didReceiveResponse,收到请求的回复,即完成请求)而block只是一个请求结果,并知道请求是否成功,面向结果的一个过程

4,从性能上来说,block的性能消耗要略大于delegate
因为block会涉及到栈区向堆区拷贝等操作,时间和空间上的消耗都大于代理。而代理只是定义了一个方法列表,在遵守协议对象的objc_protocol_list中添加一个节点,在运行时向遵守协议的对象发送消息即可。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 22.0px; font: 16.0px "PingFang SC"; color: #333333; background-color: #ffffff }
span.s1 { }

时间: 2024-11-07 02:34:31

Protocol, Delegate的相关文章

category、protocol、delegate总结

一.category(类别) 类别是一种类扩展的机制,能为现有的类添加新方法. ①类别的基本语法 @interface部分,如: @interface NSString (NumberConvenience) - (NSNumber *) lengthAsNumber; @end 我们为NSString类添加了名为NumberConvenience的类别. 注: 类别只可以添加方法,不可以添加实例变量 类别可以添加属性,但属性必须是@dynamic类型的  @implementation部分 @

protocol和delegate

protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word. 协议(protocol),就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. 委托(delegate),顾名思义就是委托别人办事,就是当 一件事情发生后,自己不处理,让别人来处理. 举个浅显的例子: 我上班的工作主要内容包括 (1)写代码(2)写文档(3)测试程序(4)接电话(5)会见客户 (1)(2)我自己全权负责,但是后面(3)(4)(5)我不想或者不

编程比喻之protocol和delegate之间的关系

编程比喻之protocol和delegate之间的关系 开篇: 当你还在忍受传统老套的讲解,被专业术语搞的晕头转向时,编程比喻横空出世,且打个酱油再回. 卖萌结束, 主角 protocol/delegate之间的爱恨情仇. 小故事 寿寿最近心血来潮,注册了一家公司iceAna,打算搞ios开发,心想:反正现在的公司没业务,一台电脑一个人足以.就这样,代码寿寿写,设计寿寿搞,连拖地烧饭都得自己干! 重要寿寿开发的一款软件得到了上市公司的赏识,立马给了500万投资.寿寿心想,公司要做到看来靠一个人的

SIP(Session Initiation Protocol,会话初始协议)

SIP(Session Initiation Protocol,会话初始协议)的开发目的是用来帮助提供跨越因特网的高级电话业务.因特网电话(IP电话)正在向一种正式的商业电话模式演进,SIP就是用来确保这种演进实现而需要的NGN(下一代网络)系列协议中重要的一员.支持H.264协议 SIP学习笔记 2007-12-28 21:39:23 学习 SIP 协议最快捷的方法是通过范例来学习, 找到了一个完整的呼叫流程,let's go! INVITE 主叫方Tesla首先发起 INVITE 消息到被叫

IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。

IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol).IMAP是斯坦福大学在1986年开发的一种邮件获取协议.它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等.当前的权威定义是RFC3501.IMAP协议运行在TCP/IP协议之上,使用的端口是143.它与POP3协议的主要区别是用户

HTTP协议(HyperText Transfer Protocol,超文本传输协议)

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准.HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等).:::::::::::::::::::::::::::::::::::::::::::::::::::::HTTP 简介http:/ /www.iis7.com/b/plc/HTTP协议是Hyper Text Transfer Protoco

IOS开发之----协议与委托(Protocol and Delegate) 实例解析

1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 在写示例之前我给大家说下@required和@optional这两个关键字 他们两个是在声明协议的时候用到,@required是必须实现的方法,要不会报黄色警告[email protected]是可选实现!实现还是不实现都不会报警告! 示例: 1 2 3 4 5 6 7 8 9 // GoodChild.h #import @protocol GoodChild -(v

第七讲.NSDate,category(分类),extension(延展),protocol(协议),delegate(代理)

一.掌握NSDate和NSDateFormatter的使用 NSDate是Cocoa中?用于处理日期和时间的基础类,封装了某一给定的时刻(含日期,时间,时区). 了解NSDate的创建,如何计算当前时间,时间间隔,以及时间日期与字符之间的互转. 1>.NSDate创建,当地时间计算,时间按间隔计算,时间与字符之间的互转 练习题1:计算当前时间与一个固定时间按的时间差 练习二:字符串转化为日期对象 二.掌握Category的定义和使用(只能为类扩展类方法或实例方法) 1.主要作用是为:没有源代码的

protocol 和 delegate

步骤 1.发出协议(在发协议者.h文件 下@interface-@end 上边) @protocol hireOneMaid <NSObject> @required//必须要实现的方法(默认) //打扫房间 - (void)cleanHouse; //照看孩子 - (void)lookayMyBaby; //给我做饭 - (void)cookWithName:(NSString *)name; @optional//可以实现,也可以实现 @end @protocol married <