关于协议和代理
2013 年 2 月 22 日
作者QQ:415074476
QQ群:191280586
协议其实只是声明系列方法,可以简单地理解成接口声明。当类支持这个协议的时候,意味着这个类可能会支持这些里面的接口。
代理是个委托关系,把自己的事请委托给另一个类来做。
目前工程里面总有类似的代码:a类需要b类做点事,做完之后反馈结果给a, a再做更进一步的处理。
总结起来是两件事:
1,a委托b做事。
2,a需求一个回调。
为此我们项目里会做三个事:a类, b类,以及为了支持回调的协议c。
没错,你看出来了,我们定义的协议仅是为了支持回调,大材小用啊。仅是使用block对象就能做的事,我们居然定义了一个协议。
这不是错误,只是不够优雅。那么什么时候改用协议,什么时候改用block呢?
我观察了cocoa里面的几个类: NSURLConnection, CLGeocoder, NSXMLParser, UIView(UIViewAnimationWithBlocks).
回调型的都是用的block, 交互型的都是delegate.
观察下地址反解析的两个类:
5.0之前是CLLocationCoordinate2D,使用的是协议。
5.0之手CLGeocoder,使用的是Block.
可见apple也是认为单纯为了支持回调定义一个协议,是不够优雅简洁的。