iOS 代理设计模式
在项目中经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式传递一些参数.
在项目中,刚开始我是用一些代理来传递参数的,但是慢慢觉得代理的代码比较block多,所以就更多的使用了block.
前几天突然想到了代理的设计模式,回头翻看了下,
protocol--协议
协议是公共的定义,如果只是某个类使用,我们常做的就是写在某个类中。如果是多个类都是用同一个协议,建议创建一个Protocol文件,在这个文件中定义协议。遵循的协议可以被继承,例如我们常用的UITableView,由于继承自UIScrollView的缘故,所以也将UIScrollViewDelegate继承了过来,我们可以通过代理方法获取UITableView偏移量等状态参数。
协议可以继承其他协议,并且可以继承多个协议,在iOS中对象是不支持多继承的,但是协议可以.
代理对象 --
代理对象在很多情况下其实是可以复用的,可以创建多个代理对象为对个委托方服务.
代理内存管理
delegate的属性都是用weak,因为strong类型的指针会造成强引用,必定会影响一个对象的生命周期,这也就会形成循环引用.
weak和assign是一种"非拥有关系"的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数.但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会.在iOS中,向nil发送消息时不会导致崩溃的,所以assign就会导致野指针的错误unrecognized selector sent to instance。
代理和block的选择
在多个消息传递时应该使用delegate.这个时候的block不便于维护而且臃肿.
一个委托对象的代理属性只能有一个代理对象,如果想要委托对象调用多个代理对象的回调应该用block.
代理是可选的,而block在方法调用的时候只能通过将某个参数传递一个nil进去.
有时候需要用到外面的属性应该用block,代理是另外的方法,属性不容易传递