代理模式是一种消息传递方式, 一个完整的代理包括:委托对象,代理对象和协议.
a. 协议:用来指定代理双方可以做什么, 必须做什么
b. 委托对象:根据协议指定代理对象需要完成的事, 即调用协议中的方法.
c. 代理对象:根据协议实现委托对象需要完成的事, 即实现协议中的方法.
代理属性使用weak
a. 原因:我们在UITableViewController中, 控制器的view就是UITableView, 这就相当于UITableViewController强引用着UITableView(代理对象).
而当我们设置delegate的时候, 一般都是让UITableViewController成为代理, 这个时候如果代理也使用strong, 就会导致循环引用, 因此代理得用weak.
b. 为什么不用assign
weak和assign是一种"非拥有关系"的指针, 通过这两种修饰符修饰的指针变量都不会改变被引用对象的引用计数. 但是在一个对象被释放后, weak会自动将指针置nil, 而assign不会. 在OC中, 向nil发送消息是不会导致崩溃的, 而assign会导致野指针错误 unrecognized selector sent to instance
代理与block对比
a. 有多个消息传递时, 用delegate实现更合适, 更清晰. block就比较臃肿, 别扭.
b. 从设计模式的角度来说, 代理更加面向过程, block则更加面向结果.
c. 性能上来说, block性能消耗略大于delegate, 因为block涉及到栈区向堆区拷贝等操作, 时间和空间上的消耗都大于代理. 而代理只是定义了一个方法列表, 在遵守协议的对象的objc_protocol_list中添加一个节点, 在运行时向遵守协议的对象发送消息即刻.