协议有两个修饰符@optional
和@required
,建立一个协议若是没有声明,默认是@required
状态的。这两个修饰符只是约定代理是否强制须要遵照协议,若是@required
状态的方法代理没有遵照,会报一个黄色的警告,只是起一个约束的做用,没有其余功能web
在iOS2.0
以前尚未引入@Protocol
正式协议以前,实现协议的功能主要是经过给NSObject
添加Category
的方式。这种经过Category
的方式,相对于iOS2.0
以后引入的@Protocol
,就叫作非正式协议。安全
通常都是使用weak修饰, 咱们定义的指针默认都是__strong
类型的,strong
类型的指针会形成强引用,一定会影响一个对象的生命周期,这也就会造成循环引用。weak
和assign
是一种“非拥有关系”的指针,经过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。在一个对象被释放后,weak
会自动将指针指向nil
,而assign
则不会,因此weak更安全。性能
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