代理是一种设计模式
代理包括委托对象,代理对象,协议3个部分
- 协议: 就是规则,置顶委托方可以委托的方法,代理方需要实现的方法,协议中不能由具体的实现, 协议可以多继承,一个类可以继承多个协议,协议也可以继承多个协议
- 委托对象:就是调用协议方法的一方
- 代理对象: 实现协议方法的一方
代理属性使用weak,举例:
- 在我们的tableViewController中,控制器的view就是tableView,这就相当于tableViewController强引用着tableView(代理对象)。
- 当我们设置delegate的时候,一般都是让tableViewController成为代理,这个时候代理如果也使用strong,那么tableView的delegate又强引用着tableViewController,所以导致循环引用,因此代理得用weak!
- 为什么不用assign
weak和assign是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。在iOS中,向nil发送消息时不会导致崩溃的,所以assign就会导致野指针的错误
代理与block对比
- 在有多个消息传递时,用delegate实现更合适,看起来也更清晰。block就不太好了,这个时候block反而不便于维护,而且看起来非常臃肿,很别扭。
- 代理更加面相过程,block则更面向结果。
- 从设计模式的角度来说,代理更佳面向过程,而block更佳面向结果。例如我们使用NSXMLParserDelegate代理进行XML解析,NSXMLParserDelegate中有很多代理方法,NSXMLParser会不间断调用这些方法将一些转换的参数传递出来,这就是NSXMLParser解析流程,这些通过代理来展现比较合适。而例如一个网络请求回来,就通过success、failure代码块来展示就比较好。
- 从性能上来说,block的性能消耗要略大于delegate,因为block会涉及到栈区向堆区拷贝等操作,时间和空间上的消耗都大于代理。而代理只是定义了一个方法列表,在遵守协议对象的objc_protocol_list中添加一个节点,在运行时向遵守协议的对象发送消息即可。
网友评论