Protocol, Delegate

协议的构成:

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

协议的修饰符:

协议有两个修饰符@optional@required,建立一个协议若是没有声明,默认是@required状态的。这两个修饰符只是约定代理是否强制须要遵照协议,若是@required状态的方法代理没有遵照,会报一个黄色的警告,只是起一个约束的做用,没有其余功能web


非正式协议:

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,这种写法不简单且不宜读;ui

2.一个对象只有一个delegate,因此单例对象不要使用delegate。spa

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

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

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

相关文章
相关标签/搜索