关于协议和代理

作者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也是认为单纯为了支持回调定义一个协议,是不够优雅简洁的。